158892025-03-07 14:20:45peti1234Hegyi levegőcpp17Elfogadva 100/1001.97s201164 KiB
#include <bits/stdc++.h>

using namespace std;
const int c=500005, k=20;
int n, m, q, ki[c], fel[c][k], maxi[c][k], szint[c];
bool v[c];
vector<vector<int> > t;
vector<pair<int, int> > sz[c];
vector<pair<int, pair<int, int> > > el;
int holvan(int a) {
    return (ki[a] ? ki[a]=holvan(ki[a]) : a);
}
bool unio(int a, int b) {
    a=holvan(a), b=holvan(b);
    if (a!=b) {
        ki[a]=b;
        return true;
    }
    return false;
}
void dfs(int a) {
    v[a]=true;
    for (int i=1; i<k; i++) {
        int s=fel[a][i-1];
        fel[a][i]=fel[s][i-1];
        maxi[a][i]=max(maxi[a][i-1], maxi[s][i-1]);
    }
    for (auto p:sz[a]) {
        int x=p.first, y=p.second;
        if (!v[x]) {
            szint[x]=szint[a]+1;
            fel[x][0]=a, maxi[x][0]=y;
            dfs(x);
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m >> q;
    t.resize(n);
    for (int i=0; i<n; i++) {
        t[i].resize(m);
        for (int j=0; j<m; j++) {
            cin >> t[i][j];
            int x=i*m+j+1, s=t[i][j];
            if (i>0) el.push_back({max(s, t[i-1][j]), {x, x-m}});
            if (j>0) el.push_back({max(s, t[i][j-1]), {x, x-1}});
        }
    }
    sort(el.begin(), el.end());
    for (auto x:el) {
        int s=x.first, a=x.second.first, b=x.second.second;
        if (unio(a, b)) {
            //cout << "fontos " << a << " " << b << " " << s << "\n";
            sz[a].push_back({b, s});
            sz[b].push_back({a, s});
        }
    }
    szint[1]=1;
    dfs(1);
    while (q--) {
        int x1, y1, x2, y2, a, b, ans=0;
        cin >> x1 >> y1 >> x2 >> y2;
        a=m*(x1-1)+y1, b=m*(x2-1)+y2;
        if (szint[a]<szint[b]) {
            swap(a, b);
        }
        for (int i=k-1; i>=0; i--) {
            if (szint[fel[a][i]]>=szint[b]) {
                ans=max(ans, maxi[a][i]);
                a=fel[a][i];
            }
        }
        for (int i=k-1; i>=0; i--) {
            if (fel[a][i]!=fel[b][i]) {
                ans=max({ans, maxi[a][i], maxi[b][i]});
                a=fel[a][i], b=fel[b][i];
            }
        }
        if (a!=b) {
            ans=max({ans, maxi[a][0], maxi[b][0]});
        }
        cout << ans << "\n";
    }
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva9ms12084 KiB
2Elfogadva12ms12084 KiB
subtask219/19
3Elfogadva14ms13620 KiB
4Elfogadva14ms13512 KiB
5Elfogadva18ms13248 KiB
6Elfogadva17ms13320 KiB
7Elfogadva18ms13320 KiB
8Elfogadva16ms13456 KiB
9Elfogadva16ms13548 KiB
10Elfogadva17ms13876 KiB
subtask320/20
11Elfogadva9ms11964 KiB
12Elfogadva14ms12340 KiB
13Elfogadva28ms15348 KiB
14Elfogadva231ms44604 KiB
15Elfogadva894ms167572 KiB
subtask420/20
16Elfogadva1.047s162964 KiB
17Elfogadva1.115s188368 KiB
18Elfogadva986ms137852 KiB
19Elfogadva867ms132500 KiB
20Elfogadva939ms131976 KiB
subtask531/31
21Elfogadva342ms52196 KiB
22Elfogadva365ms42064 KiB
23Elfogadva340ms40888 KiB
24Elfogadva305ms40884 KiB
25Elfogadva347ms47268 KiB
26Elfogadva294ms38572 KiB
27Elfogadva280ms41132 KiB
28Elfogadva312ms47528 KiB
29Elfogadva263ms47776 KiB
subtask610/10
30Elfogadva1.519s201164 KiB
31Elfogadva1.97s150656 KiB
32Elfogadva1.674s144888 KiB
33Elfogadva1.325s144224 KiB
34Elfogadva1.838s175780 KiB
35Elfogadva1.636s165756 KiB
36Elfogadva1.19s134540 KiB
37Elfogadva987ms142472 KiB
38Elfogadva1.213s176276 KiB
39Elfogadva1.269s178560 KiB