Submission #1310994

#TimeUsernameProblemLanguageResultExecution timeMemory
1310994okahak71Birthday gift (IZhO18_treearray)C++20
100 / 100
1521 ms82884 KiB
#include <bits/stdc++.h>
#define ll long long
#define pll array<ll, 2>
#define lll array<ll, 3>
#define all(X) X.begin(), X.end()
#define pb push_back
using namespace std;

const ll inf = 1e17;

ll timer = 0;
vector<vector<ll>>g, up;
vector<ll>tin, tout;

void dfs(ll u, ll p = 0){
    tin[u] = ++timer;
    up[0][u] = p;
    for(ll &v : g[u]){
        if(v == p) continue;
        dfs(v, u);
    }
    tout[u] = ++timer;
}

bool is_anc(ll a, ll b){
    return tin[a] <= tin[b] and tout[a] >= tout[b];
}

ll lca(ll a, ll b){
    if(!(a * b)) return (a ? a : b);
    if(is_anc(a, b)) return a;
    if(is_anc(b, a)) return b;
    for(ll i = 19; i >= 0; i--){
        if(up[i][a] and !is_anc(up[i][a], b))
            a = up[i][a];
    }
    return up[0][a];
}

void _(){
    ll n, m, q;
    cin >> n >> m >> q;
    g.assign(n + 1, {});
    tin.assign(n + 1, 0);
    tout.assign(n + 1, 0);
    vector<ll>vv(m); set<pll>lc, st;
    up.assign(20, vector<ll>(n + 1, 0));
    for(ll i = 1; i < n; i++){
        ll a, b; cin >> a >> b;
        g[a].pb(b), g[b].pb(a);
    }
    dfs(1);
    for(ll i = 1; i < 20; i++){
        for(ll j = 1; j <= n; j++)
            up[i][j] = up[i - 1][up[i - 1][j]];
    }
    for(ll i = 0; i < m; i++){
        cin >> vv[i]; st.insert({vv[i], i});
        if(i) lc.insert({lca(vv[i], vv[i - 1]), i - 1});
    }
    while(q--){
        ll t; cin >> t;
        if(t == 1){
            ll id, vl; cin >> id >> vl;
            --id; if(id) lc.erase({lca(vv[id - 1], vv[id]), id - 1});
            if(id < m - 1) lc.erase({lca(vv[id], vv[id + 1]), id});
            st.erase({vv[id], id}); vv[id] = vl; st.insert({vv[id], id});
            if(id) lc.insert({lca(vv[id - 1], vv[id]), id - 1});
            if(id < m - 1) lc.insert({lca(vv[id], vv[id + 1]), id});
        }
        else{
            ll l, r, v;
            cin >> l >> r >> v; --l, --r;
            auto itt = st.lower_bound({v, l});
            auto it = lc.lower_bound({v, l});
            if(itt != st.end() and (*itt)[1] <= r and (*itt)[0] == v){
                cout << (*itt)[1] + 1 << ' ' << (*itt)[1] + 1 << endl;
                continue;
            }
            //if(itt == st.end()) cout << "no";
            if(it == lc.end() or (*it)[1] >= r or (*it)[0] != v) cout << "-1 -1";
            else cout << (*it)[1] + 1 << ' ' << (*it)[1] + 2; cout << endl;
        }
        //for(auto [x, y] : lc) cout << x << 'l' << y << endl;
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0); _();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...