Submission #1284371

#TimeUsernameProblemLanguageResultExecution timeMemory
1284371Hurryup_7735Birthday gift (IZhO18_treearray)C++20
0 / 100
1 ms332 KiB
//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);
        }
        else{
            ll l , r , val , mid; cin >> l >> r >> val;
            ll idxa = -1 , idxb = -1;
            bool ok = false;
            ll L = 0 , R = r - l;
            while(L <= R){
                ll mid = (L + R) >> 1;
                for(i = mid ; i <= n - mid ; i++){
                    if(getans(i , i + mid , 1 , m , 1) == val){
                        idxa = i;
                        idxb = i + mid;
                        ok = true;
                        break;
                    }
                }
                if(ok || mid == 0) 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...