제출 #1100605

#제출 시각아이디문제언어결과실행 시간메모리
1100605vjudge1Birthday gift (IZhO18_treearray)C++98
30 / 100
4074 ms9024 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200005, M = 20; int up[N][M], dep[N], tin[N], tout[N], timer = 0; int a[N]; vector<int> adj[N]; //dfs void dfs(int v, int p) { tin[v] = ++timer; up[v][0] = p; for(int i = 1; i < M; i++) { up[v][i] = up[up[v][i - 1]][i - 1]; } for(int u : adj[v]) { if(u != p) { dep[u] = dep[v] + 1; dfs(u, v); } } tout[v] = ++timer; } // предок па? bool is(int v, int u) { return tin[v] <= tin[u] && tout[v] >= tout[u]; } //наименьший общий предок иуу int lca(int u, int v) { if(is(u, v)) { return u; } if(is(v, u)) { return v; } for(int i = M - 1; i >= 0; i--) { if(!is(up[u][i], v)) { u = up[u][i]; } } return up[u][0]; } int main() { 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, 1); for(int i = 0; i < m; i++) { cin >> a[i]; } for(int i = 0; i < q; i++) { int tp; cin >> tp; //запрашиваем типы if(tp == 1) { int pos, v; cin >> pos >> v; pos--; a[pos] = v; } else if(tp == 2) { int l, r, v; cin >> l >> r >> v; l--; r--; bool ok = false; for(int x = l; x <= r && !ok; x++) { int cur = a[x]; for(int y = x; y <= r; y++) { cur = lca(cur, a[y]); if(cur == v) { cout << x + 1 << " " << y + 1 << endl; ok = true; break; } } } if(!ok) { cout << -1 << " " << -1 << endl; } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...