Submission #1351088

#TimeUsernameProblemLanguageResultExecution timeMemory
1351088michael12Birthday gift (IZhO18_treearray)C++20
30 / 100
4094 ms992 KiB
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<numeric>
#include<string>
#include<stack>
#include<queue>
#include<string.h>
#include<array>
#include<climits>
#include<algorithm>
#include<cmath>
using namespace std;

#define ff first
#define ss second
#define int long long
#define pb push_back
#define endl '\n'
const int maxn = 1e5 + 2;
const int Mx = 1e12;
const int oo = 1e18;
const int LG = 20;
int depth[maxn];
int up[maxn][LG];
vector<int> adj[maxn];
void dfs(int u, int p){
     up[u][0] = p;
     for(int i = 1; i < LG; i++){
        up[u][i] = up[up[u][i - 1]][i - 1];
     }
     for(auto v : adj[u]){
        if(v == p) continue;
        depth[v] = depth[u] + 1;
        dfs(v, u);
     }
}
int lca(int u, int v){
    if(depth[u] < depth[v]) swap(u, v);
    int diff = depth[u] - depth[v];
    for(int i = 0; i < LG; i++){
        if(diff & (1 << i)){
            u = up[u][i];
        }
    }
    if(u == v) return u;
    for(int i = LG - 1; i >= 0; i--){
        if(up[u][i] != up[v][i]){
            u = up[u][i];
            v = up[v][i];
        }
    }
    return up[u][0];
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m, k;
    cin >> n >> m >> k;
    for(int i = 0; i < n - 1; i++){
        int a, b;
        cin >> a >> b;
        adj[a - 1].push_back(b - 1);
        adj[b - 1].push_back(a - 1);
    }
    vector<int> a(m);
    for(int i = 0; i < m; i++){
        cin >> a[i];
        a[i]--;
    }
    dfs(0, 0);
    while(k--){
        int t;
        cin >> t;
        if(t == 2){
            int l, r, d;
            cin >> l >> r >> d;
            l--, r--, d--;
            int ans = 0;
            bool is = false;
            for(int i = l; i <= r; i++){
                int val = a[i];
                for(int j = i; j <= r; j++){
                    val = lca(val, a[j]);
                    if(val == d){
                        cout << i + 1 << " " << j + 1 << endl;
                        is = true;
                        break;
                    }
                }
                if(is) break;
            }
            if(!is){
                cout << "-1 -1" << endl;
            }
            
        }
        else{
            int pos, d;
            cin >> pos >> d;
            d--;
            a[pos - 1] = d;
        }

    }

    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...