제출 #1024182

#제출 시각아이디문제언어결과실행 시간메모리
1024182AcanikolicBirthday gift (IZhO18_treearray)C++14
56 / 100
222 ms1108 KiB
#include <bits/stdc++.h> #define int long long #define pb push_back #define F first #define S second using namespace std; const int N = 2000 + 10; const int mod = 1e9 + 7; const int inf = 1e9; const int LOG = 17; vector<int>g[N]; int up[N][LOG],in[N],out[N],timer = 0,a[N],st[N * 4]; void dfs(int x,int par) { in[x] = ++timer; up[x][0] = par; for(int j = 1; j < LOG; j++) up[x][j] = up[up[x][j - 1]][j - 1]; for(auto X : g[x]) { if(X != par) { dfs(X,x); } } out[x] = timer; } bool inn(int u,int v) { return in[u] <= in[v] && out[u] >= out[v]; } int lca(int u,int v) { if(u == inf) return v; if(v == inf) return u; if(inn(u,v)) return u; if(inn(v,u)) return v; for(int j = LOG - 1; j >= 0; j--) { if(up[u][j] > 0 && !inn(up[u][j],v)) u = up[u][j]; } return up[u][0]; } void build(int node,int tl,int tr) { if(tl == tr) { st[node] = a[tl]; return; } int mid = (tl + tr) / 2; build(node * 2,tl,mid); build(node * 2 + 1,mid + 1,tr); st[node] = lca(st[node * 2],st[node * 2 + 1]); } void modify(int node,int tl,int tr,int i,int v) { if(tl > i || tr < i) return; if(tl == tr) { st[node] = v; return; } int mid = (tl + tr) / 2; modify(node * 2,tl,mid,i,v); modify(node * 2 + 1,mid + 1,tr,i,v); st[node] = lca(st[node * 2],st[node * 2 + 1]); } int get(int node,int tl,int tr,int l,int r) { if(tl > r || tr < l) return inf; if(tl >= l && tr <= r) return st[node]; int mid = (tl + tr) / 2; return lca(get(node * 2,tl,mid,l,r),get(node * 2 + 1,mid + 1,tr,l,r)); } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n,m,q; cin >> n >> m >> q; for(int i = 1; i <= n - 1; i++) { int u,v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } dfs(1,0); for(int i = 1; i <= m; i++) cin >> a[i]; build(1,1,m); while(q--) { int type; cin >> type; if(type == 1) { int i,v; cin >> i >> v; modify(1,1,m,i,v); a[i] = v; }else { int l,r,v; cin >> l >> r >> v; int L = -1,R = -1; for(int i = l; i + 1 <= r; i++) { if(get(1,1,m,i,i + 1) == v) { L = i; R = i + 1; break; } } for(int i = l; i <= r; i++) if(a[i] == v) L = i,R = i; cout << L << " " << R << "\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...