5031 2023. 04. 10 00:56:36 rmlan Hegyi levegő cpp14 Időlimit túllépés 50/100 3.227s 344816 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];
            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 1820 KiB
2 Elfogadva 3ms 2176 KiB
subtask2 19/19
3 Elfogadva 14ms 5244 KiB
4 Elfogadva 16ms 5332 KiB
5 Elfogadva 16ms 5552 KiB
6 Elfogadva 16ms 5592 KiB
7 Elfogadva 16ms 5784 KiB
8 Elfogadva 16ms 5896 KiB
9 Elfogadva 16ms 6248 KiB
10 Elfogadva 16ms 6588 KiB
subtask3 0/20
11 Elfogadva 3ms 3660 KiB
12 Elfogadva 7ms 4200 KiB
13 Elfogadva 56ms 9452 KiB
14 Elfogadva 736ms 63028 KiB
15 Időlimit túllépés 3.055s 151676 KiB
subtask4 0/20
16 Elfogadva 2.326s 300772 KiB
17 Elfogadva 2.818s 300960 KiB
18 Időlimit túllépés 3.056s 145024 KiB
19 Időlimit túllépés 3.069s 139568 KiB
20 Időlimit túllépés 3.059s 138816 KiB
subtask5 31/31
21 Elfogadva 1.235s 63252 KiB
22 Elfogadva 1.366s 60516 KiB
23 Elfogadva 1.282s 58360 KiB
24 Elfogadva 1.358s 58312 KiB
25 Elfogadva 1.139s 63252 KiB
26 Elfogadva 1.174s 58104 KiB
27 Elfogadva 1.213s 58652 KiB
28 Elfogadva 1.569s 63444 KiB
29 Elfogadva 621ms 71904 KiB
subtask6 0/10
30 Időlimit túllépés 3.079s 152132 KiB
31 Időlimit túllépés 3.069s 145540 KiB
32 Időlimit túllépés 3.052s 139972 KiB
33 Időlimit túllépés 3.079s 139140 KiB
34 Időlimit túllépés 3.227s 151672 KiB
35 Időlimit túllépés 3.072s 161156 KiB
36 Időlimit túllépés 3.062s 136736 KiB
37 Időlimit túllépés 3.081s 137500 KiB
38 Időlimit túllépés 3.072s 152456 KiB
39 Elfogadva 2.704s 344816 KiB