제출 #1164507

#제출 시각아이디문제언어결과실행 시간메모리
1164507omar1312Birthday gift (IZhO18_treearray)C++20
100 / 100
660 ms111000 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset; #define ll long long #define pb push_back #define all(x) x.begin(), x.end() const int mod = 1000000007; const int N = 200005; ll a[N+2], dp[N+2], sp[N+2][32], dep[N+2], par[N+2]; set<int> s[N+2], sd[N+2]; vector<int> adj[N+2]; void dfs(int n, int _par, int d){ par[n] = _par; dep[n] = d; for(auto &i : adj[n]){ if(i != _par){ dfs(i, n, d + 1); } } } void solve(){ int n, m, q; cin>>n>>m>>q; for(int i = 0; i < n - 1; i++){ int u, v; cin>>u>>v; adj[u].pb(v); adj[v].pb(u); } for(int i = 0; i < m; i++){ cin>>a[i]; } dfs(1, 0, 0); for(int i = 1; i <= n; i++){ sp[i][0] = par[i]; } for(int j = 1; j <= 30; j++){ for(int i = 1; i <= n; i++){ sp[i][j] = sp[sp[i][j - 1]][j - 1]; } } auto lca = [&](ll u, ll v) -> ll{ if(dep[u] < dep[v])swap(u, v); if(dep[u] ^ dep[v]){ ll delta = dep[u] - dep[v]; for(int j = 30; j >= 0; j--){ if((delta >> j) & 1){ u = sp[u][j]; } } } if(u == v)return u; for(int j = 30; j >= 0; j--){ if(sp[u][j] != sp[v][j]){ u = sp[u][j]; v = sp[v][j]; } } return par[u]; }; for(int i = 0; i < m; i++){ if(i < m - 1)s[lca(a[i], a[i + 1])].insert(i + 1); sd[a[i]].insert(i); } while(q--){ int t; cin>>t; if(t == 1){ int pos, v; cin>>pos>>v; --pos; sd[a[pos]].erase(pos); sd[v].insert(pos); if(pos != 0)s[lca(a[pos], a[pos - 1])].erase(pos), s[lca(v, a[pos - 1])].insert(pos); if(pos != m - 1)s[lca(a[pos], a[pos + 1])].erase(pos + 1), s[lca(v, a[pos + 1])].insert(pos + 1); a[pos] = v; } else{ int l, r, v; cin>>l>>r>>v; --l, --r; auto it = sd[v].upper_bound(r); if(it != sd[v].begin()){ it = prev(it); if(*it >= l){ cout<<*it + 1<<' '<<*it + 1<<'\n'; continue; } } auto it2 = s[v].upper_bound(r); if(it2 != s[v].begin()){ it2 = prev(it2); if(*it2 > l){ cout<<*it2<<' '<<*it2 + 1<<'\n'; continue; } } cout<<-1<<' '<<-1<<'\n'; } } } int main(){ cin.tie(0)->sync_with_stdio(0); int tt = 1; //cin>>tt; while(tt--){ solve(); cout<<'\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...