50322023-04-10 01:00:02rmlanHegyi levegőcpp14Időlimit túllépés 50/1003.088s345440 KiB
#include<bits/stdc++.h>
using namespace std;

int n,m,q,timer=0;
int m2;
vector<vector<pair<int, int> > > g;
vector<pair<int, int> > e;
vector<int> p,sz,tin,tout,dis;
vector<bool> vis;
int anc[500001][21]={0};
int mx[500001][21]={0};

void make_set(int v){
    p[v]=v;
    sz[v]=1;
}

int find_set(int v){
    if(p[v] == v) return v;
    return find_set(p[v]);
}

bool unite(int a, int b){
    a = find_set(a);
    b = find_set(b);
    if(a == b) return 0;
    if(sz[a] < sz[b]) swap(a,b);
    p[b]=a;
    sz[a]+=sz[b];
    return 1;
}

int na(int u, int nn, int b=20){
    if(!nn) return u;
    for(int i = b; i >= 0; i--){
        if(nn-(1 << i) >= 0) return na(anc[u][i], nn-(1<<i), i);
    }
}
int nm(int u, int nn, int b=20){
    if(!nn) return 0;
    if(nn==1) return mx[u][0];
    for(int i = b; i >= 0; i--){
        if(nn-(1 << i) >= 0) return max(mx[u][i], nm(anc[u][i], nn-(1<<i), i));
    }
}


void dfs(int u, int it){

    if(vis[u]) return;
    tin[u]=timer++;
    vis[u]=1;
    if(it > 0){
        anc[u][it] = anc[anc[u][it-1]][it-1];
        mx[u][it]= max(mx[u][it-1], mx[anc[u][it-1]][it-1]);
    }
    for(pair<int, int> pr:g[u]){
        if(vis[pr.second]) continue;

        if(!it){
            dis[pr.second]=dis[u]+1;
            anc[pr.second][0]=u;
            mx[pr.second][0]=pr.first;
        }
        dfs(pr.second, it);
    }
    tout[u] = timer++;
}

int solve(int a, int b){
    if(dis[a] > dis[b]) swap(a,b);

    if(tin[a] < tin[b] && tout[a] > tout[b]){
        return nm(b, dis[b]-dis[a]);
    }
    int cr=0;
    for(int i = 19; i >= 0; i--){
        if(na(b, cr+(1 << i)+dis[b]-dis[a]) != na(a, cr+(1<<i))){

            cr +=(1<<i);
        }
    }
    cr++;

    return max(nm(b,cr+dis[b]-dis[a]), nm(a,cr));
}

int main(){

    cin >> n >> m >> q;
    int mp[n][m];

    g.resize(n*m);
    p.resize(n*m);
    sz.resize(n*m);
    tin.resize(n*m);
    tout.resize(n*m);
    dis.resize(n*m);
    vector<pair<int, int> > ek;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            //cin >> mp[i][j];
            scanf("%d", &mp[i][j]);
            if(i>0){
                e.push_back({max(mp[i][j], mp[i-1][j]), (i*m+j)*10});
            }
            if(j > 0){
                e.push_back({max(mp[i][j], mp[i][j-1]), (i*m+j)*10+1});
            }
        }
    }
    sort(e.begin(), e.end());
    for(int i = 0; i < n*m; i++){
        make_set(i);
    }
    for(pair<int, int> pa:e){
        if(pa.second%10){

            if(unite(pa.second/10, pa.second/10-1)) ek.push_back(pa);
        }else{

            if(unite(pa.second/10, pa.second/10-m)) ek.push_back(pa);
        }
    }
    for(pair<int, int> pa:ek){
        if(pa.second%10){
            g[pa.second/10].push_back({pa.first, pa.second/10-1});
            g[pa.second/10-1].push_back({pa.first, pa.second/10});

        }else{
            g[pa.second/10].push_back({pa.first, pa.second/10-m});
            g[pa.second/10-m].push_back({pa.first, pa.second/10});
        }
    }


    anc[n*m/2][0]=n*m/2;
    dis[n*m/2]=0;
    for(int i = 0; i < 20; i++){
        vis.assign(n*m, 0);
        dfs(n*m/2, i);
    }


    while(q--){
        int ai,bi,ci,di;
        //cin >> ai >> bi >> ci >> di;
        scanf("%d %d %d %d",&ai, &bi, &ci, &di);
        cout << solve(ai*m+bi-m-1, ci*m+di-m-1) << endl;

    }

}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1816 KiB
2Elfogadva3ms2180 KiB
subtask219/19
3Elfogadva13ms5364 KiB
4Elfogadva14ms5336 KiB
5Elfogadva14ms5560 KiB
6Elfogadva14ms5560 KiB
7Elfogadva14ms5440 KiB
8Elfogadva14ms5600 KiB
9Elfogadva14ms5728 KiB
10Elfogadva13ms6304 KiB
subtask30/20
11Elfogadva3ms3212 KiB
12Elfogadva7ms3904 KiB
13Elfogadva52ms9104 KiB
14Elfogadva699ms62600 KiB
15Időlimit túllépés3.075s151320 KiB
subtask40/20
16Elfogadva2.622s300560 KiB
17Elfogadva2.798s300684 KiB
18Időlimit túllépés3.063s144800 KiB
19Időlimit túllépés3.069s139144 KiB
20Időlimit túllépés3.055s138556 KiB
subtask531/31
21Elfogadva1.34s62648 KiB
22Elfogadva1.486s60156 KiB
23Elfogadva1.18s58132 KiB
24Elfogadva1.325s58252 KiB
25Elfogadva1.299s63072 KiB
26Elfogadva1.254s58032 KiB
27Elfogadva1.195s58564 KiB
28Elfogadva1.409s63376 KiB
29Elfogadva679ms72064 KiB
subtask60/10
30Időlimit túllépés3.072s152408 KiB
31Időlimit túllépés3.046s145764 KiB
32Időlimit túllépés3.061s140316 KiB
33Időlimit túllépés3.075s139496 KiB
34Időlimit túllépés3.061s152664 KiB
35Időlimit túllépés3.071s161664 KiB
36Időlimit túllépés3.036s137076 KiB
37Időlimit túllépés3.069s137840 KiB
38Időlimit túllépés3.088s153064 KiB
39Elfogadva2.332s345440 KiB