Submission #844912

#TimeUsernameProblemLanguageResultExecution timeMemory
844912Darren0724Birthday gift (IZhO18_treearray)C++17
56 / 100
4030 ms35932 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]; 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]; } int up(int a, int b) { return lca(a, b) == b; } 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 = 0; i < q; i++){ int id; cin >> id; if (id == 1) { int a,b;cin>>a>>b; v[a]=b; } else { int a,b,c;cin>>a>>b>>c; int y=-1; int p=0; int ans1=-1,ans2=-1; for(int j=a;j<=b;j++){ if(!up(v[j],c)){ y=-1; } else{ if(y==-1){ p=j; y=v[j]; } else{ y=lca(y,v[j]); } } if(y==c){ ans1=p,ans2=j; break; } } cout<<ans1<<' '<<ans2<<endl; } } 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...