Submission #1248861

#TimeUsernameProblemLanguageResultExecution timeMemory
1248861LmaoLmaoBirthday gift (IZhO18_treearray)C++20
100 / 100
1261 ms98056 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define name "a"
#define int long long
using namespace std;

using ll = long long;
using ii = pair<ll, ll>;
using aa = array<int,3>;

const int N = 2e5+5;
const int INF = 1e9;
const int MOD = 1e9+7;

multiset<ii> mp[N];
int s[N], head[N];
int up[N][20];
int par[N],d[N];
vector<int> adj[N];
int timer=0;
int a[N];
int eu[N];

void dfs(int u,int p) {
    s[u]=1;
    d[u]=d[p]+1;
    up[u][0]=p;
    for(int i=1;i<20;i++) {
        up[u][i]=up[up[u][i-1]][i-1];
    }
    for(int v:adj[u]) {
        if(v==p) continue;
        dfs(v,u);
        s[u]+=s[v];
    }
    return;
}

int lca(int u,int v) {
    if(d[u]<d[v]) swap(u,v);
    for(int i=18;i>=0;i--) {
        if(d[up[u][i]]>=d[v]) {
            u=up[u][i];
        }
    }
    if(u==v) return u;
    for(int i=18;i>=0;i--) {
        if(up[u][i]!=up[v][i]) {
            u=up[u][i];
            v=up[v][i];
        }
    }
    return up[u][0];
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n,m,q;
    cin >> n >> m >> q;
    for(int i=1;i<n;i++) {
        int u,v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(1,0);
    for(int i=1;i<=m;i++) {
        cin >> a[i];
        if(i!=1) {
            mp[lca(a[i-1],a[i])].insert({i-1,i});
            //cout << lca(a[i-1],a[i]) << endl;
            //cout << i << ' ' << lca(a[i-1],a[i]) << endl;
        }
        mp[a[i]].insert({i,i});
    }
    while(q--) {
        int type;
        cin >> type;
        if(type==1) {
            int pos,v;
            cin >> pos >> v;
            if(pos!=m) {
                int x=lca(a[pos],a[pos+1]);
                auto t=mp[x].lower_bound({pos,pos+1});
                mp[x].erase(t);
            }
            if(pos!=1) {
                int x=lca(a[pos],a[pos-1]);
                auto t=mp[x].lower_bound({pos-1,pos});
                mp[x].erase(t);
            }
            mp[a[pos]].erase({pos,pos});
            a[pos]=v;
            mp[a[pos]].insert({pos,pos});
            if(pos!=m) {
                int x=lca(a[pos],a[pos+1]);
                mp[x].insert({pos,pos+1});
            }
            if(pos!=1) {
                int x=lca(a[pos-1],a[pos]);
                mp[x].insert({pos-1,pos});
            }
        }
        else {
            int l,r,v;
            cin >> l >> r >> v;
            auto t=mp[v].lower_bound({l,-1});
            if(t==mp[v].end()) {
                cout << -1 << ' ' << -1 << '\n';
                continue;
            }
            ii ans=*t;
            if(ans.se>r) {
                cout << -1 << ' ' << -1 << '\n';
                continue;
            }
            cout << ans.fi << ' ' << ans.se << '\n';
        }
    }
    //cout << lca(3,5);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...