//In The Name Of ALLAH!
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define ll long long
#define ld long double
#define endl '\n'
#define pb push_back
#define pf push_front
#define Zemur007 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define bpc __builtin_popcountll
#define btz __builtin_ctzll
#define all(x) x.begin() , x.end()
#define allr(x) x.rbegin() , x.rend()
#define F first
#define S second
#define pll pair<ll , ll>
#define turtle tuple<ll , ll , ll>
#define pss pair<string , string>
#define YES cout << "YES" << endl;
#define NO cout << "NO" << endl;
#define indexed_set tree<pll , null_type , less<pll> , rb_tree_tag , tree_order_statistics_node_update>
const ll sz = 2e5 + 5 , INF = 1e18 , MOD = 1e9 + 7;
ll a[sz] , st[sz<<2];
vector<ll> g[sz];
ll par[sz][20] , lvl[sz];
bool used[sz];
void dfs(ll n , ll p){
used[n] = 1;
par[n][0] = p;
lvl[n] = lvl[p] + 1;
for(ll i = 1 ; i < 20 ; i++){
par[n][i] = par[par[n][i - 1]][i - 1];
}
for(ll i : g[n]){
if(!used[i]){
dfs(i , n);
}
}
}
ll LCA(ll x , ll y){
if(lvl[x] < lvl[y]) swap(x , y);
for(ll i = 19 ; i >= 0 ; i--){
if(lvl[x] - (1 << i) >= lvl[y]){
x = par[x][i];
}
}
if(x == y) return x;
for(ll i = 19 ; i >= 0 ; i--){
if(par[x][i] != par[y][i]){
x = par[x][i];
y = par[y][i];
}
}
return par[x][0];
}
void build(ll l , ll r , ll in){
if(l == r){
st[in] = a[l];
return;
}
ll mid = (l + r) >> 1;
build(l , mid , in<<1);
build(mid + 1 , r , in<<1|1);
st[in] = LCA(st[in<<1] , st[in<<1|1]);
}
void update(ll x , ll val , ll l , ll r , ll in){
if(x > r || x < l) return;
if(l == r){
st[in] = val;
return;
}
ll mid = (l + r) >> 1;
update(x , val , l , mid , in<<1);
update(x , val , mid + 1 , r , in<<1|1);
st[in] = LCA(st[in<<1] , st[in<<1|1]);
}
ll getans(ll a , ll b , ll l , ll r , ll in){
if(a > r || l > b) return -1;
if(a <= l && r <= b){
return st[in];
}
ll mid = (l + r) >> 1;
if(getans(a , b , l , mid , in<<1) == -1) return getans(a , b , mid + 1 , r , in<<1|1);
else if(getans(a , b , mid + 1 , r , in<<1|1) == -1) return getans(a , b , l , mid , in<<1);
return LCA(getans(a , b , l , mid , in<<1) , getans(a , b , mid + 1 , r , in<<1|1));
}
ll mask , i , j , k;
void solve(){
ll n , m , q; cin >> n >> m >> q;
for(i = 1 ; i < n ; i++){
ll u , v; cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
dfs(1 , 0);
for(i = 1 ; i <= m ; i++) cin >> a[i];
build(1 , m , 1);
while(q--){
ll op; cin >> op;
if(op == 1){
ll x , val; cin >> x >> val;
a[x] = val;
update(x , val , 1 , m , 1);
}
//4 5 5 3
//2 3 4 5
else{
ll x , y , val; cin >> x >> y >> val;
ll idxa = -1 , idxb = -1;
ll l = 1 , r = y - x + 1;
bool ok = false;
while(l <= r){
ll mid = (l + r) >> 1;
for(i = x + mid ; i <= y + 1 ; i++){
if(getans(i - mid , i - 1, 1 , m , 1) == val){
ok = true;
idxa = i - mid;
idxb = i - 1;
break;
}
}
if(ok || mid == 1) break;
else r = mid - 1;
}
cout << idxa << ' ' << idxb << endl;
}
}
}
signed main(){
Zemur007;
//open;
ll t = 1;
// cin >> t;
while(t--){
solve();
}
// for(ll testcase = 1 ; testcase <= t ; testcase++){
// cout << "Case " << testcase << ":" << endl;
// solve();
// }
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |