CCCPaste

Untitled

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 3e5 + 10;
const int logn = 24;
int n;
int id_node[maxn];
int parent[maxn];
int depth[maxn];
int up_node[maxn][logn];
int LCA(int A, int B) {
    if(depth[A] < depth[B]) {
        swap(A, B);
    }
    for(int i = logn - 1; i >= 0; i--) {
        if(depth[A] - (1 << i) >= depth[B]) {
            A = up_node[A][i];
        }
    }
    if(A == B) {
        return A;
    }
    for(int i = logn - 1; i >= 0; i--) {
        if(up_node[A][i] != -1 and up_node[A][i] != up_node[B][i]) {
            A = up_node[A][i];
            B = up_node[B][i];
        }
    }
    return up_node[A][0];
                   
}
int main() {
    ios_base::sync_with_stdio(false);
    int n;
    cin >> n;
    depth[0] = 0;
    parent[0] = 0;
    vector queries(n + 1, -1);
    vector > > find_LCA;
    for(int i = 1; i <= n; i++) {
        char c;
        cin >> c;
        if(c == 'a') {
            int x;
            cin >> x;
            x = id_node[x];
            id_node[i] = i;
            parent[i] = x;
            depth[i] = depth[parent[i]] + 1;
        }
        else if(c == 'b') {
            int x;
            cin >> x;
            x = id_node[x];
            id_node[i] = parent[x];
            queries[i] = x;
        }
        else if(c == 'c') {
            int x, y;
            cin >> x >> y;
            x = id_node[x];
            y = id_node[y];
            id_node[i] = x;
            find_LCA.push_back(make_pair(i, make_pair(x, y)));
            
        }
    }
    for(int i = 0; i <= n; i++) {
        up_node[i][0] = parent[i];
        for(int j = 1; j < logn; j++) {
            up_node[i][j] = up_node[up_node[i][j - 1]][j - 1];
        }
    }
    for(int i = 0; i < find_LCA.size(); i++) {
        int a = find_LCA[i].second.first;
        int b = find_LCA[i].second.second;
        queries[find_LCA[i].first] = depth[LCA(a, b)];
    }
    for(int i = 1; i <= n; i++) {
        if(queries[i] != -1) {
            cout << queries[i] << endl;
        }
    }
    return 0;
}

/*
 12
 1 2
 2 4
 2 5
 4 7
 5 8
 1 3
 3 6
 6 9
 6 10
 6 11
 11 12
 
 **/