Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <set>
- #include <iomanip>
- #include <stack>
- #include <queue>
- #include <string>
- #include <cmath>
- #include <map>
- #include <cstdlib>
- #include <unordered_set>
- #include <unordered_map>
- #include <random>
- #include <chrono>
- using namespace std;
- #define pb push_back
- #define f first
- #define s second
- #define mp make_pair
- #define pii pair <int, int>
- typedef long long ll;
- typedef long double ld;
- typedef vector <int> vi;
- const int MAXN = 1e6 + 10;
- ll INF = 1e9 + 10;
- ll MOD = 1e9 + 7;
- int q;
- int par[MAXN], d[MAXN], up[MAXN][20];
- void add(int a, int b){
- d[b] = d[a] + 1;
- par[b] = a;
- for(int i = 0; i < 20; i++){
- i == 0 ? up[b][i] = par[b] : up[b][i] = up[up[b][i - 1]][i - 1];
- }
- }
- int get(int a, int b){
- if(d[a] > d[b])
- swap(a, b);
- int dif = d[b] - d[a];
- for(int i = 0; i < 20; i++){
- if((dif >> i) & 1)
- b = up[b][i];
- }
- if(a == b)
- return a;
- for(int i = 19; i >= 0; i--){
- if(up[a][i] != up[b][i]){
- a = up[a][i];
- b = up[b][i];
- }
- }
- return par[a];
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- freopen("lca.in", "r", stdin);
- freopen("lca.out", "w", stdout);
- cin >> q;
- while(q--){
- string s;
- int a, b;
- cin >> s >> a >> b;
- if(s == "ADD"){
- add(a - 1, b - 1);
- }
- else{
- cout << get(a - 1, b - 1) + 1 << '\n';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement