제출 #846595

#제출 시각아이디문제언어결과실행 시간메모리
846595Darren0724Birthday gift (IZhO18_treearray)C++17
100 / 100
760 ms82480 KiB
#include <bits/stdc++.h> using namespace std; // #define int long long #define all(x) x.begin(), x.end() const int N = 200005; const int K = __lg(N) + 1; int n, m, q; vector<int> adj[N], deep(N); int jump[K][N]; set<int> s1[N], s2[N]; void dfs(int k, int pa) { jump[0][k] = pa; for (int i = 1; i < K; i++) { jump[i][k] = jump[i - 1][jump[i - 1][k]]; } for (int j : adj[k]) { if (j == pa) { continue; } deep[j] = deep[k] + 1; dfs(j, k); } } int lca(int a, int b) { if (deep[a] < deep[b]) { swap(a, b); } int p = deep[a] - deep[b]; for (int i = 0; i < K; i++) { if ((1 << i) & p) { a = jump[i][a]; } } if (a == b) { return a; } for (int i = K - 1; i >= 0; i--) { if (jump[i][a] != jump[i][b]) { a = jump[i][a]; b = jump[i][b]; } } return jump[0][a]; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> q; for (int i = 1; i < n; i++) { int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } dfs(1, 1); vector<int> v(m + 1); for (int i = 1; i <= m; i++) { cin >> v[i]; } for (int i = 1; i <= m; i++) { s1[v[i]].insert(i); } for (int i = 1; i < m; i++) { s2[lca(v[i],v[i+1])].insert(i); } for (int i = 0; i < q; i++) { int id; cin >> id; if (id == 1) { int a, b; cin >> a >> b; s1[v[a]].erase(a); if(a<m){ s2[lca(v[a],v[a+1])].erase(a); } if(a>1){ s2[lca(v[a-1],v[a])].erase(a-1); } v[a] = b; s1[v[a]].insert(a); if(a<m){ s2[lca(v[a],v[a+1])].insert(a); } if(a>1){ s2[lca(v[a-1],v[a])].insert(a-1); } } else { int l,r,v;cin>>l>>r>>v; auto it1=s1[v].lower_bound(l); if(it1!=s1[v].end()&&*it1<=r){ cout<<*it1<<' '<<*it1<<'\n'; continue; } auto it2=s2[v].lower_bound(l); if(it2!=s2[v].end()&&*it2+1<=r){ cout<<*it2<<' '<<*it2+1<<'\n'; continue; } cout<<-1<<' '<<-1<<'\n'; } } 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...