제출 #1361351

#제출 시각아이디문제언어결과실행 시간메모리
1361351vjudge1Birthday gift (IZhO18_treearray)C++20
100 / 100
591 ms92160 KiB
// That is not your swag, I swear you fake hard
#define Mo2 ios_base::sync_with_stdio(false) , cin.tie(NULL) , cout.tie(NULL);
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define tru ? cout<<"YES\n" : cout<<"NO\n"
#define int long long
const int N = 1e5+5 , OO = 0x3f3f3f3f3f3f3f3f , mod = 1e9+7;

// math problems are solved using math
// slow is smooth, smooth is fast

signed main() { 
    Mo2
    // ???? ??????
    int n,m,q,type,u,v,l,r; cin>>n>>m>>q;
    vector <vector<int>> adj(n);
    for(int i = 1 ; i < n ; ++i) {
        cin>>u>>v;
        --u; --v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    int LOG = __lg(n) + 1;
    vector <vector<int>> up(n,vector<int>(LOG));
    vector <int> depth(n);
    function <void(int,int)> dfs = [&] (int u,int p) {
        up[u][0] = p;
        for(int i = 1 ; i < LOG ; ++i) {
            up[u][i] = up[up[u][i-1]][i-1];
        }
        for(int &v : adj[u]) if(v != p) {
            depth[v] = depth[u] + 1;
            dfs(v,u);
        }
    };
    auto lca = [&] (int u, int v) {
        if(depth[u] < depth[v]) swap(u,v);
        int k = depth[u] - depth[v];
        for(int i = 0 ; i < LOG ; ++i) if(k >> i & 1) u = up[u][i];
        if(u == v) return u;
        for(int i = LOG - 1 ; ~i ; --i) {
            if(up[u][i] != up[v][i]) {
                u=up[u][i];
                v=up[v][i];
            }
        }
        return up[u][0];
    };
    dfs(0,0);
    vector <int> a(m);
    for(int i = 0 ; i < m ; ++i) cin>>a[i],--a[i];
    set <int> st[n],LC[n];
    for(int i = 0 ; i < m ; ++i) st[a[i]].insert(i);
    for(int i = 0 ; i + 1 < m ; ++i) {
        LC[lca(a[i],a[i+1])].insert(i);
    }
    while(q--) {
        cin>>type;
        if(type==1) {
            cin>>l>>u;
            --l; --u;
            int cur = a[l];
            st[cur].erase(l);
            st[u].insert(l);
            if(m == 1) {
                a[l] = u;
                continue;
            }
            if(!l) {
                int lc = lca(a[0],a[1]);
                LC[lc].erase(0);
                a[l] = u;
                lc = lca(a[0],a[1]);
                LC[lc].insert(0);
            }
            else if(l == m - 1) {
                int lc = lca(a[m-1],a[m-2]);
                LC[lc].erase(m-2);
                a[l] = u;
                lc = lca(a[m-1],a[m-2]);
                LC[lc].insert(m-2);
            }
            else {
                int lc1 = lca(a[l],a[l-1]) , lc2 = lca(a[l],a[l+1]);
                LC[lc1].erase(l-1);
                LC[lc2].erase(l);
                a[l] = u;
                lc1 = lca(a[l],a[l-1]) , lc2 = lca(a[l],a[l+1]);
                LC[lc1].insert(l-1);
                LC[lc2].insert(l);
            }
        }
        else {
            cin>>l>>r>>u;
            --u;
            --l; --r;
            bool fail = true;
            if(st[u].size()) {
                auto it = st[u].lower_bound(l);
                if(it != st[u].end() && *it <= r) {
                    cout<<*it+1<<' '<<*it+1<<endl;
                    fail = false;
                }
            }
            if(fail) {
                if(LC[u].size()) {
                    auto it = LC[u].lower_bound(l);
                    if(it != LC[u].end() && *it + 1 <= r) {
                        cout<<*it+1<<' '<<*it+2<<endl;
                        fail = false;
                    }
                }
            }
            if(fail) cout<<-1<<' '<<-1<<endl;
        }
    }
    return (0-0);
}   
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…