제출 #607731

#제출 시각아이디문제언어결과실행 시간메모리
607731abcvuitunggioBirthday gift (IZhO18_treearray)C++17
100 / 100
965 ms80424 KiB
#include <iostream> #include <vector> #include <set> using namespace std; int n,m,q,p[200001][20],t,l,r,k,st[200001],en[200001],id,a[200001],u,v; vector <int> ke[200001]; set <int> s[200001],s2[200001]; void dfs(int u, int par){ st[u]=++id; for (int v:ke[u]) if (v!=par){ p[v][0]=u; dfs(v,u); } en[u]=++id; } void prep(){ for (int i=1;i<20;i++) for (int j=1;j<=n;j++) p[j][i]=p[p[j][i-1]][i-1]; } bool isancestor(int i, int j){ return (st[i]<=st[j]&&en[i]>=en[j]); } int lca(int i, int j){ if (isancestor(i,j)) return i; if (isancestor(j,i)) return j; for (int k=19;k>=0;k--) if (p[i][k]&&!isancestor(p[i][k],j)) i=p[i][k]; return p[i][0]; } int main(){ ios_base::sync_with_stdio(NULL);cin.tie(nullptr); cin >> n >> m >> q; for (int i=1;i<n;i++){ cin >> u >> v; ke[u].push_back(v); ke[v].push_back(u); } dfs(1,1); prep(); for (int i=1;i<=m;i++){ cin >> a[i]; s[a[i]].insert(i); if (i>1) s2[lca(a[i-1],a[i])].insert(i-1); } while (q--){ cin >> t >> l >> r; if (t==1){ s[a[l]].erase(l); if (l<m) s2[lca(a[l],a[l+1])].erase(l); if (l>1) s2[lca(a[l-1],a[l])].erase(l-1); a[l]=r; s[a[l]].insert(l); if (l<m) s2[lca(a[l],a[l+1])].insert(l); if (l>1) s2[lca(a[l-1],a[l])].insert(l-1); continue; } cin >> k; if (!s[k].empty()&&(*--s[k].end())>=l){ int x=*s[k].lower_bound(l); if (x<=r){ cout << x << ' ' << x << '\n'; continue; } } if (!s2[k].empty()&&(*--s2[k].end())>=l){ int x=*s2[k].lower_bound(l); if (x<r){ cout << x << ' ' << x+1 << '\n'; continue; } } cout << "-1 -1\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...