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...