제출 #1307145

#제출 시각아이디문제언어결과실행 시간메모리
1307145jahongirBirthday gift (IZhO18_treearray)C++20
100 / 100
519 ms79752 KiB
#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; #define pb push_back #define all(a) a.begin(),a.end() typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef unsigned long long ull; typedef vector<int> vi; static const int buf_size = 4096; inline int getChar() { static char buf[buf_size]; static int len = 0, pos = 0; if (pos == len) pos = 0, len = fread(buf, 1, buf_size, stdin); if (pos == len) return -1; return buf[pos++]; } inline int readChar() { int c = getChar(); while (c <= 32) c = getChar(); return c; } template <class T = int> inline T readInt() { int s = 1, c = readChar(); T x = 0; if (c == '-') s = -1, c = getChar(); while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getChar(); return s == 1 ? x : -x; } /** Write */ static int write_pos = 0; static char write_buf[buf_size]; inline void writeChar( int x ) { if (write_pos == buf_size) fwrite(write_buf, 1, buf_size, stdout), write_pos = 0; write_buf[write_pos++] = x; } inline void flush() { if (write_pos) fwrite(write_buf, 1, write_pos, stdout), write_pos = 0; } template <class T = int> inline void writeInt( T x ) { if (x < 0) writeChar('-'), x = -x; char s[24]; int n = 0; while (x || !n) s[n++] = '0' + x % 10, x /= 10; while (n--) writeChar(s[n]); } const int mxn = 2e5+1, lg2 = 18; vector<int> g[mxn]; int suc[mxn][lg2]; int tin[mxn],tout[mxn],tim=0; int arr[2][mxn]; void pre_dfs(int u, int p){ suc[u][0] = p; tin[u] = ++tim; for(int i = 1; i < lg2; i++) suc[u][i] = suc[suc[u][i-1]][i-1]; for(auto v : g[u]) if(v!=p) pre_dfs(v,u); tout[u] = tim; } bool is_anc(int u, int v){ return tin[u]<=tin[v] && tout[v]<=tout[u]; } int get_lca(int u, int v){ if(is_anc(u,v)) return u; if(is_anc(v,u)) return v; for(int i = lg2-1; i >= 0; i--) if(!is_anc(suc[u][i],v)) u = suc[u][i]; return suc[u][0]; } set<int> st[2][mxn]; void solve(){ int n,m,q; cin >> n >> m >> q; for(int i = 1; i < n; i++){ int u,v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } pre_dfs(1,1); for(int i = 1; i <= m; i++){ cin >> arr[0][i]; st[0][arr[0][i]].insert(i); if(i>1){ arr[1][i-1] = get_lca(arr[0][i-1],arr[0][i]); st[1][arr[1][i-1]].insert(i-1); } } for(int _ = 0; _ < q; _++){ char t; cin >> t; if(t=='1'){ int i,v; cin >> i >> v; st[0][arr[0][i]].erase(i); st[0][v].insert(i); arr[0][i] = v; if(i<m){ st[1][arr[1][i]].erase(i); arr[1][i] = get_lca(arr[0][i],arr[0][i+1]); st[1][arr[1][i]].insert(i); } if(i>1){ st[1][arr[1][i-1]].erase(i-1); arr[1][i-1] = get_lca(arr[0][i-1],arr[0][i]); st[1][arr[1][i-1]].insert(i-1); } }else{ int l,r,v; cin >> l >> r >> v; auto it = st[0][v].lower_bound(l); if(it != st[0][v].end() && *it <= r){ cout << *it << ' ' << *it << '\n'; }else{ if(l < r){ it = st[1][v].lower_bound(l); if(it != st[1][v].end() && *it < r){ cout << *it << ' ' << *it+1 << '\n'; }else cout << "-1 -1\n"; }else cout << "-1 -1\n"; } } } } signed main(){ cin.tie(0)->sync_with_stdio(0); int t = 1; // cin >> t; while(t--){solve();} }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...