Submission #1140079

#TimeUsernameProblemLanguageResultExecution timeMemory
1140079AgageldiBirthday gift (IZhO18_treearray)C++17
0 / 100
141 ms282264 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define N 4000005 #define ff first #define ss second #define pb push_back #define sz(s) (int)s.size() #define all(x) x.begin(),x.end() ll n, t, a[N], q, m, vis[N], sp[N][22], lvl[N]; vector <int> v[N]; multiset <int> s[N]; int kth_anscestor(int x,int y) { for(int i = 0; i<= 20;i++) { if(y&(1<<i)) { x = sp[x][i]; } } return x; } int find(int x,int y) { if(lvl[x] < lvl[y]) { y = kth_anscestor(y,lvl[y] - lvl[x]); } if(lvl[y] < lvl[x]) { x = kth_anscestor(x,lvl[x] - lvl[y]); } if(x == y) return x; for(int i = 20;i >= 0; i--) { if(sp[x][i] != sp[y][i]) { x = sp[x][i]; y = sp[y][i]; } } return sp[x][0]; } void dfs(int x,int cnt) { lvl[x] = cnt; vis[x] = 1; for(auto i:v[x]) { if(vis[i]) continue; sp[i][0] = x; dfs(i,cnt + 1); } } int main () { ios::sync_with_stdio(0);cin.tie(0); cin >> n >> m >> q; for(int i = 1; i < n; i++) { int x, y; cin >> x >> y; v[x].pb(y); v[y].pb(x); } for(int i = 1; i <= m; i++) { cin >> a[i]; s[a[i]].insert(i); } dfs(1,1); for(int i = 1; i <= n; i++) { for(int j = 1; j <= 20; j++) { sp[i][j] = sp[sp[i][j - 1]][j - 1]; } } for(int i = 1; i < m; i++) { s[find(a[i], a[i + 1])].insert(i); } for(int i = 1; i <= q; i++) { int pos, x, l, r; cin >> t; if(t == 1) { cin >> pos >> x; s[x].insert(pos); s[a[pos]].erase(s[a[pos]].find(pos)); if(pos > 1) { int tt = find(a[pos],a[pos - 1]); s[tt].erase(s[tt].find(pos - 1)); tt = find(x,a[pos - 1]); s[tt].insert(pos - 1); } if(pos < n) { int tt = find(a[pos],a[pos + 1]); s[tt].erase(s[tt].find(pos)); tt = find(x,a[pos + 1]); s[tt].insert(pos); } a[pos] = x; continue; } cin >> l >> r >> x; if(!sz(s[x])) { cout <<"-1 -1\n"; continue; } auto p = lower_bound(s[x].begin(),s[x].end(),l); if(p == s[x].end() || (*p) > r) { cout << "-1 -1\n"; continue; } if(a[(*p)] == x) { cout << (*p) <<" " << (*p) << '\n'; continue; } if((*p) + 1 > r) { cout <<"-1 -1\n"; continue; } cout << (*p) << " " << (*p) + 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...