5032 2023. 04. 10 01:00:02 rmlan Hegyi levegő cpp14 Időlimit túllépés 50/100 3.088s 345440 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 Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1816 KiB
2 Elfogadva 3ms 2180 KiB
subtask2 19/19
3 Elfogadva 13ms 5364 KiB
4 Elfogadva 14ms 5336 KiB
5 Elfogadva 14ms 5560 KiB
6 Elfogadva 14ms 5560 KiB
7 Elfogadva 14ms 5440 KiB
8 Elfogadva 14ms 5600 KiB
9 Elfogadva 14ms 5728 KiB
10 Elfogadva 13ms 6304 KiB
subtask3 0/20
11 Elfogadva 3ms 3212 KiB
12 Elfogadva 7ms 3904 KiB
13 Elfogadva 52ms 9104 KiB
14 Elfogadva 699ms 62600 KiB
15 Időlimit túllépés 3.075s 151320 KiB
subtask4 0/20
16 Elfogadva 2.622s 300560 KiB
17 Elfogadva 2.798s 300684 KiB
18 Időlimit túllépés 3.063s 144800 KiB
19 Időlimit túllépés 3.069s 139144 KiB
20 Időlimit túllépés 3.055s 138556 KiB
subtask5 31/31
21 Elfogadva 1.34s 62648 KiB
22 Elfogadva 1.486s 60156 KiB
23 Elfogadva 1.18s 58132 KiB
24 Elfogadva 1.325s 58252 KiB
25 Elfogadva 1.299s 63072 KiB
26 Elfogadva 1.254s 58032 KiB
27 Elfogadva 1.195s 58564 KiB
28 Elfogadva 1.409s 63376 KiB
29 Elfogadva 679ms 72064 KiB
subtask6 0/10
30 Időlimit túllépés 3.072s 152408 KiB
31 Időlimit túllépés 3.046s 145764 KiB
32 Időlimit túllépés 3.061s 140316 KiB
33 Időlimit túllépés 3.075s 139496 KiB
34 Időlimit túllépés 3.061s 152664 KiB
35 Időlimit túllépés 3.071s 161664 KiB
36 Időlimit túllépés 3.036s 137076 KiB
37 Időlimit túllépés 3.069s 137840 KiB
38 Időlimit túllépés 3.088s 153064 KiB
39 Elfogadva 2.332s 345440 KiB