제출 #341957

#제출 시각아이디문제언어결과실행 시간메모리
341957TosicBirthday gift (IZhO18_treearray)C++14
100 / 100
1222 ms77420 KiB
#include <bits/stdc++.h> #define maxn 200010 using namespace std; int n, m, q; int up[maxn][20],iT[maxn], oT[maxn], gT, a[maxn]; vector<vector<int> > gr; set<int> allNum[maxn], allPai[maxn]; void dfs(int x, int p){ iT[x] = gT; ++gT; up[x][0] = p; for(int i =1 ; i < 20; ++i){ up[x][i] = up[up[x][i-1]][i-1]; } for(auto i : gr[x]){ if(i != p){ dfs(i, x); } } oT[x] = gT; ++gT; } bool isA(int a, int b){ if(iT[a] <= iT[b] and oT[a] >= oT[b]){ return true; } return 0; } int lca(int x, int y){ if(isA(x, y)){ return x; } if(isA(y, x)){ return y; } for(int i = 19; i >= 0; --i){ if(!isA(up[x][i], y)){ x = up[x][i]; } } return up[x][0]; } int main(){ ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); cin >> n >> m >> q; gr.resize(n, vector<int>()); for(int i = 1; i < n; ++i){ int u,v; cin >> u >> v; --u, v--; gr[u].push_back(v); gr[v].push_back(u); } dfs(0, 0); for(int i = 0; i < m; ++i){ cin >> a[i]; --a[i]; allNum[a[i]].insert(i); if(i){ allPai[lca(a[i], a[i-1])].insert(i); } } for(int i = 0; i < q; ++i){ int t; cin >> t; if(t == 1){ int ps, val; cin >> ps >> val; --ps; --val; allNum[a[ps]].erase(ps); if(ps){ allPai[lca(a[ps-1], a[ps])].erase(ps); allPai[lca(a[ps-1], val)].insert(ps); } if(ps < m-1){ allPai[lca(a[ps+1], a[ps])].erase(ps+1); allPai[lca(a[ps+1], val)].insert(ps+1); } a[ps] = val; allNum[val].insert(ps); } else { int l, r, v; cin >> l >> r >> v; --l, --r, --v; auto tmp = allNum[v].lower_bound(l); if(tmp != allNum[v].end() and *tmp <= r){ cout << *tmp+1 << ' ' << *tmp+1 << '\n'; continue; } tmp=allPai[v].upper_bound(l); if(tmp != allPai[v].end() and *tmp <= r){ cout << *tmp << ' ' << *tmp+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...