48242023-03-31 12:49:57gortomiHegyi levegőcpp17Időlimit túllépés 70/1003.076s233744 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int> > > p;
pair<int, int> get(pair<int, int> n)
{
    return p[n.first][n.second] == make_pair(0, 0) ? n : p[n.first][n.second] = get(p[n.first][n.second]);
}
void unio(pair<int, int> a, pair<int, int> b)
{
    a = get(a);
    b = get(b);
    if(a != b) p[a.first][a.second] = b;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, m, q;
    scanf("%d %d %d", &n, &m, &q);
    p.resize(n + 1, vector<pair<int, int> >(m + 1, make_pair(0, 0)));
    vector<vector<int> > v(n + 2, vector<int>(m + 2, INT_MAX));
    vector<int> comp;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            scanf("%d", &v[i][j]);
            comp.push_back(v[i][j]);
        }
    }
    sort(comp.begin(), comp.end());
    comp.erase(unique(comp.begin(), comp.end()), comp.end());
    vector<vector<pair<int, int> > > add(n * m + 1);
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            v[i][j] = lower_bound(comp.begin(), comp.end(), v[i][j]) - comp.begin();
            add[v[i][j]].push_back({i, j});
        }
    }
    vector<int> l(q), r(q);
    vector<pair<int, int> > a(q), b(q);
    vector<vector<int> > que(n * m + 1);
    for(int i = 0; i < q; i++)
    {
        scanf("%d %d %d %d", &a[i].first, &a[i].second, &b[i].first, &b[i].second);
        l[i] = -1;
        r[i] = n * m;
        que[(l[i] + r[i]) / 2].push_back(i);
    }
    int db = 0;
    while(db != q)
    {
        fill(p.begin(), p.end(), vector<pair<int, int> >(m + 1, make_pair(0, 0)));
        for(int i = 0; i <= n * m; i++)
        {
            for(auto z : add[i])
            {
                int x = z.first, y = z.second;
                if(v[x - 1][y] <= i) unio(z, {x - 1, y});
                if(v[x + 1][y] <= i) unio(z, {x + 1, y});
                if(v[x][y - 1] <= i) unio(z, {x, y - 1});
                if(v[x][y + 1] <= i) unio(z, {x, y + 1});
            }
            for(auto x : que[i])
            {
                if(get(a[x]) == get(b[x])) r[x] = i;
                else l[x] = i;
                if(l[x] + 1 == r[x])
                {
                    db++;
                }
                else
                {
                    que[(l[x] + r[x]) / 2].push_back(x);
                }
            }
            que[i].clear();
        }
    }
    for(int i = 0; i < q; i++)  printf("%d\n", comp[r[i]]);
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1708 KiB
2Elfogadva3ms1880 KiB
subtask219/19
3Elfogadva8ms3524 KiB
4Elfogadva10ms3528 KiB
5Elfogadva10ms3796 KiB
6Elfogadva12ms4012 KiB
7Elfogadva12ms4164 KiB
8Elfogadva12ms4448 KiB
9Elfogadva10ms4560 KiB
10Elfogadva8ms5564 KiB
subtask320/20
11Elfogadva3ms3584 KiB
12Elfogadva4ms3944 KiB
13Elfogadva23ms7928 KiB
14Elfogadva289ms46708 KiB
15Elfogadva2.2s164704 KiB
subtask40/20
16Elfogadva1.11s151784 KiB
17Időlimit túllépés3.076s105288 KiB
18Elfogadva1.758s121152 KiB
19Elfogadva1.881s118264 KiB
20Elfogadva1.894s117536 KiB
subtask531/31
21Elfogadva910ms79460 KiB
22Elfogadva620ms63596 KiB
23Elfogadva685ms66464 KiB
24Elfogadva672ms66532 KiB
25Elfogadva428ms64896 KiB
26Elfogadva379ms55852 KiB
27Elfogadva307ms56276 KiB
28Elfogadva287ms60300 KiB
29Elfogadva279ms58736 KiB
subtask60/10
30Időlimit túllépés3.075s133724 KiB
31Időlimit túllépés3.069s106960 KiB
32Időlimit túllépés3.039s101028 KiB
33Időlimit túllépés3.069s101096 KiB
34Elfogadva2.857s233744 KiB
35Elfogadva2.91s214404 KiB
36Elfogadva1.569s178500 KiB
37Elfogadva1.256s171268 KiB
38Elfogadva1.222s205096 KiB
39Elfogadva1.22s198312 KiB