5035 2023. 04. 10 12:02:40 rmlan Hegyi levegő cpp14 Időlimit túllépés 70/100 3.088s 337328 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 p[v]=find_set(p[v]);
}

bool unite(int a, int b){
    if(n== 1) return 1;
    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)){
                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{

            if(unite(pa.second/10, pa.second/10-m)){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(0, 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 1884 KiB
2 Elfogadva 3ms 2272 KiB
subtask2 19/19
3 Elfogadva 12ms 5624 KiB
4 Elfogadva 14ms 5380 KiB
5 Elfogadva 14ms 5416 KiB
6 Elfogadva 14ms 5576 KiB
7 Elfogadva 14ms 5772 KiB
8 Elfogadva 14ms 5852 KiB
9 Elfogadva 13ms 5976 KiB
10 Elfogadva 10ms 6652 KiB
subtask3 20/20
11 Elfogadva 3ms 3428 KiB
12 Elfogadva 4ms 4112 KiB
13 Elfogadva 34ms 10164 KiB
14 Elfogadva 428ms 69672 KiB
15 Elfogadva 2.154s 332336 KiB
subtask4 0/20
16 Elfogadva 1.756s 332488 KiB
17 Elfogadva 1.631s 332596 KiB
18 Időlimit túllépés 3.071s 141708 KiB
19 Elfogadva 2.967s 269076 KiB
20 Elfogadva 2.927s 267760 KiB
subtask5 31/31
21 Elfogadva 887ms 69892 KiB
22 Elfogadva 1.355s 59360 KiB
23 Elfogadva 1.126s 57056 KiB
24 Elfogadva 1.343s 57080 KiB
25 Elfogadva 615ms 70084 KiB
26 Elfogadva 1.039s 57000 KiB
27 Elfogadva 1.032s 57396 KiB
28 Elfogadva 688ms 70548 KiB
29 Elfogadva 560ms 71120 KiB
subtask6 0/10
30 Időlimit túllépés 3.079s 168208 KiB
31 Időlimit túllépés 3.065s 142016 KiB
32 Időlimit túllépés 3.063s 136588 KiB
33 Időlimit túllépés 3.088s 135940 KiB
34 Elfogadva 2.98s 333060 KiB
35 Időlimit túllépés 3.072s 157508 KiB
36 Időlimit túllépés 3.072s 133200 KiB
37 Időlimit túllépés 3.059s 134088 KiB
38 Elfogadva 2.585s 333548 KiB
39 Elfogadva 2.355s 337328 KiB