// In The Name Of God
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <bitset>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <unordered_set>
#include <unordered_map>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define sagyndym_seni ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
const int N = 2e5+5, M = (1 << 20), p1 = 911382323, p2 = 972663749, INF = 1e9+123;
inline int read(){
char c = getchar_unlocked();
bool minus = 0;
while (c < '0' || '9' < c){
if(c == '-'){ minus = 1;}
c = getchar_unlocked();
if(c == '-'){ minus = 1;}
}
int res = 0;
while ('0' <= c && c <= '9') {
res = (res << 3) + (res << 1) + c - '0';
c = getchar_unlocked();
}
if(minus){ res = (~res) + 1;}
return res;
}
int n, m, q;
int pos[M], LOG[M], vec[N];
pair<int, int> st[M][20];
vector<int> g[N];
vector<pair<int, int>> order;
void dfs(int v, int p, int depth){
order.pb({depth, v});
assert(sz(order) < (N << 2));
pos[v] = sz(order)-1;
for(auto to : g[v]){
if(to == p){ continue;}
dfs(to, v, depth + 1);
order.pb({depth, v});
}
}
inline void precalc(){
LOG[1] = 0;
for(int i = 2; i < (N << 2); i++){
LOG[i] = LOG[i >> 1] + 1;
}
for(int i = 0; i < sz(order); i++){
assert(i < (N << 2));
st[i][0] = order[i];
}
for(int j = 1; j < 30; j++){
for(int i = 0; i + (1 << j) <= sz(order); i++){
st[i][j] = min(st[i][j-1], st[i + (1 << (j-1))][j-1]);
}
}
}
inline int mn(int l, int r){
if(r < l){ swap(l, r);}
assert(r - l + 1 < (N << 2) && r < (N << 2));
int j = LOG[r - l + 1];
pair<int, int> res = min(st[l][j], st[r - (1 << j) + 1][j]);
return res.s;
}
multiset<pair<int, int>> tUno[N << 2], tDos[N << 2];
void build_uno(int v, int vl, int vr){
if(vl == vr){
int val = vl == m - 1 ? -1 : mn(pos[vec[vl]], pos[vec[vl + 1]]);
tUno[v].insert({val, vl});
return;
}
int vm = (vl + vr) >> 1;
build_uno(v*2+1, vl, vm);
build_uno(v*2+2, vm+1, vr);
merge(all(tUno[v*2+1]), all(tUno[v*2+2]), inserter(tUno[v], tUno[v].begin()));
}
void build_dos(int v, int vl, int vr){
if(vl == vr){
tDos[v].insert({vec[vl], vl});
return;
}
int vm = (vl + vr) >> 1;
build_dos(v*2+1, vl, vm);
build_dos(v*2+2, vm+1, vr);
merge(all(tDos[v*2+1]), all(tDos[v*2+2]), inserter(tDos[v], tDos[v].begin()));
}
void modify_dos(int v, int vl, int vr, int idx, int old_val, int new_val){
tDos[v].erase(tDos[v].find({old_val, idx}));
tDos[v].insert({new_val, idx});
if(vl != vr){
int vm = (vl + vr) >> 1;
if(idx <= vm){
modify_dos(v*2+1, vl, vm, idx, old_val, new_val);
}else{
modify_dos(v*2+2, vm+1, vr, idx, old_val, new_val);
}
}
}
void modify_uno(int v, int vl, int vr, int idx, int old_val, int new_val){
tUno[v].erase(tUno[v].find({old_val, idx}));
tUno[v].insert({new_val, idx});
if(vl != vr){
int vm = (vl + vr) >> 1;
if(idx <= vm){
modify_uno(v*2+1, vl, vm, idx, old_val, new_val);
}else{
modify_uno(v*2+2, vm+1, vr, idx, old_val, new_val);
}
}
}
int query_uno(int v, int vl, int vr, int l, int r, int val){
if(l > vr || r < vl || r < l){ return -1;}
if(l <= vl && vr <= r){
auto it = tUno[v].lower_bound({val, -1});
if(it == tUno[v].end()){ return -1;}
pair<int, int> temp = *it;
return temp.f == val ? temp.s : -1;
}
int vm = (vl + vr) >> 1;
int q = query_uno(v*2+1, vl, vm, l, r, val);
if(q != -1){ return q;}
return query_uno(v*2+2, vm+1, vr, l, r, val);
}
int query_dos(int v, int vl, int vr, int l, int r, int val){
if(l > vr || r < vl || r < l){ return -1;}
if(l <= vl && vr <= r){
auto it = tDos[v].lower_bound({val, -1});
if(it == tDos[v].end()){ return -1;}
pair<int, int> temp = *it;
return temp.f == val ? temp.s : -1;
}
int vm = (vl + vr) >> 1;
int q = query_dos(v*2+1, vl, vm, l, r, val);
if(q != -1){ return q;}
return query_dos(v*2+2, vm+1, vr, l, r, val);
}
int main(){
sagyndym_seni;
n = read(); m = read(); q = read();
for(int i = 1; i < n; i++){
int v = read()-1, u = read()-1;
g[v].pb(u);
g[u].pb(v);
}
for(int i = 0; i < m; i++){
vec[i] = read()-1;
}
int fl = -1;
cout<<LOG[fl];
dfs(0, 0, 0);
precalc();
build_uno(0, 0, m - 1);
build_dos(0, 0, m - 1);
while(q--){
int tp = read()-1;
if(!tp){
int p = read()-1, v = read()-1;
modify_dos(0, 0, m - 1, p, vec[p], v);
if(p != m - 1){
modify_uno(0, 0, m - 1, p, mn(pos[vec[p]], pos[vec[p + 1]]), mn(pos[v], pos[vec[p + 1]]));
}
if(p != 0){
modify_uno(0, 0, m - 1, p - 1, mn(pos[vec[p-1]], pos[vec[p]]), mn(pos[v], pos[vec[p-1]]));
}
vec[p] = v;
}else{
int l = read()-1, r = read()-1, p = read()-1;
int res1 = query_dos(0, 0, m - 1, l, r, p);
if(res1 != -1){ cout<<'\n'<<res1 + 1<<' '<<res1 + 1; continue;}
int res2 = query_uno(0, 0, m - 1, l, r - 1, p);
res2 == -1 ? cout<<"\n-1 -1" : cout<<'\n'<<res2 + 1<<' '<<res2 + 2;
}
}
return 0;
}
/* TIMUS: 292220YC*/
Compilation message
treearray.cpp: In function 'int main()':
treearray.cpp:192:14: warning: array subscript is below array bounds [-Warray-bounds]
cout<<LOG[fl];
^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
52 ms |
83320 KB |
Wrong output format. |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
52 ms |
83320 KB |
Wrong output format. |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
52 ms |
83320 KB |
Wrong output format. |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
52 ms |
83320 KB |
Wrong output format. |
2 |
Halted |
0 ms |
0 KB |
- |