Submission #1265446

#TimeUsernameProblemLanguageResultExecution timeMemory
1265446rayan_bdBirthday gift (IZhO18_treearray)C++20
30 / 100
4091 ms784 KiB
#include <bits/stdc++.h>
using namespace std;
const int mxN = 2005;
const int mxB = 15;
vector<int> adj[mxN];
int dp[mxN][mxB], depth[mxN], a[mxN], st[mxN], en[mxN], timer = -1;
void dfs(int u = 1, int par = 0){
    st[u] = ++timer;
    depth[u] = depth[par] + 1;
    dp[u][0] = par;
    for(int i = 1; i < mxB; ++i) dp[u][i] = dp[dp[u][i - 1]][i - 1];
    for(auto it : adj[u]){
        if(it ^ par){
            dfs(it, u);
        }
    }
    en[u] = ++timer;
}
bool in_subtree(int u, int v){
    return st[v] >= st[u] && en[v] <= en[u];
}
int kth(int u, int k){
    for(int i = 0; i < mxB; ++i){
        if(k & (1 << i)) u = dp[u][i];
    }
    return u;
}
int lca(int u, int v){
    if(depth[u] < depth[v]) swap(u, v);
    u = kth(u, depth[u] - depth[v]);
    if(u == v) return u;
    for(int i = mxB - 1; i >= 0; --i){
        if(dp[u][i] ^ dp[v][i]){
            u = dp[u][i];
            v = dp[v][i];
        }
    }
    return dp[u][0];
}
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    int n, m, q, u, v, l, r, idx, t;
    cin >> n >> m >> q;
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i < n - 1; ++i){
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i = 0; i < m; ++i) cin >> a[i];
    dfs();
    for(int i = 0; i < q; ++i){
        cin >> t;
        if(t == 1){
            cin >> idx >> v;
            a[--idx] = v;
        }else{
            cin >> l >> r >> v;
            int ansl = -1, ansr = -1, till = -1;
            for(int i = l - 1; i <= r - 1 && ansl == -1; ++i){
                till = a[i];
                for(int j = i; j <= r - 1; ++j){
                    if(!in_subtree(v, a[j])) break;
                    till = lca(till, a[j]);
                    if(till == v){
                        ansl = i + 1, ansr = j + 1;
                        break;
                    }
                }
            }
            cout << ansl << " " << ansr << "\n";
        }
    }
    return 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...