Submission #1165044

#TimeUsernameProblemLanguageResultExecution timeMemory
1165044AliMark71Birthday gift (IZhO18_treearray)C++20
0 / 100
0 ms324 KiB
//
//  main.cpp
//  GeneralCompetitiveProgramming
//
//  Created by Ali AlSalman on 12/07/2023.
//

#include <bits/stdc++.h>

//#define INTERACTIVE
//#define TESTCASES

#ifndef INTERACTIVE
#define endl '\n'
#endif

template<typename T>
using vec = std::vector<T>;
using namespace std;

unordered_map<int, set<int>> ind_seq;
unordered_map<int, set<int>> ind_slc;
vec<vec<int>> adj;

vec<vec<int>> st(19);
vec<int> dep;

void root(int u = 0, int p = -1, int d = 0) {
    st[0][u] = p;
    dep[u] = d;
    for (auto c : adj[u]) if (c != p) {
        root(c, u, d + 1);
    }
}

void init_bin_lift() {
    for (int k = 1; k < st.size(); k++) for (int i = 0; i < st.front().size(); i++) if (st[k - 1][i] != -1) {
        st[k][i] = st[k - 1][st[k - 1][i]];
    }
}

int lca(int a, int b) {
    if (dep[b] < dep[a]) swap(a, b);
    int climb = dep[b] - dep[a];
    for (int i = 0; i < 19; i++) if ((1<<i)&climb) {
        b = st[i][b];
    }
    
    if (a == b) return a;
    for (int i = 18; 0 <= i; i--) {
        if (st[i][a] != st[i][b]) {
            a = st[i][a];
            b = st[i][b];
        }
    }
    
    return st[0][a];
}

void solve() {
    int n, m, q;
    cin>>n>>m>>q;
    adj.resize(n);
    for (int i = n - 1; i--;) {
        int a, b;
        cin>>a>>b; a--; b--;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    
    vec<int> seq(m);
    for (int i = 0; i < m; i++) {
        cin>>seq[i];
        ind_seq[--seq[i]].insert(i);
    }
    
    fill(st.begin(), st.end(), vec<int>(n, -1));
    dep.resize(n);
    root();
    init_bin_lift();
    
    vec<int> slc(m - 1);
    for (int i = 0; i < slc.size(); i++){
        slc[i] = lca(seq[i], seq[i + 1]);
        ind_slc[slc[i]].insert(i);
    }
    
    
    while (q--) {
        int t;
        cin>>t;
        if (t == 1) {
            int i, v;
            cin>>i>>v; i--; v--;
            ind_seq[seq[i]].erase(i);
            ind_seq[seq[i] = v].insert(i);
            
            if (i < m - 1) {
                ind_slc[slc[i]].erase(i);
                ind_slc[slc[i] = lca(seq[i], seq[i + 1])].insert(i);
            }
            
            if (0 < i) {
                ind_slc[slc[i - 1]].erase(i - 1);
                ind_slc[slc[i - 1] = lca(seq[i - 1], seq[i])].insert(i);
            }
        } else {
            int l, r, v;
            cin>>l>>r>>v; l--; r--; v--;
            
            auto seq_lit = ind_seq[v].lower_bound(l);
            auto seq_uit = ind_seq[v].upper_bound(r);
            if (seq_lit != seq_uit) {
                cout<<*seq_lit + 1<<' '<<*seq_lit + 1<<endl;
                continue;
            }
            
            auto slc_lit = ind_slc[v].lower_bound(l);
            auto slc_uit = ind_slc[v].upper_bound(r);
            if (slc_lit != slc_uit) {
                cout<<*slc_lit + 1<<' '<<*slc_lit + 2<<endl;
                continue;
            }
            
            cout<<"-1 -1"<<endl;
        }
    }
}

int main() {
#ifndef INTERACTIVE
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#endif
    
    int t = 1;
#ifdef TESTCASES
    cin>>t;
#endif
    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...