Planets Queries I

binary lifting
View Original
Back to Graph Algorithms

Implementation

C++

                                #include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define F first
#define S second
#define ll long long
#define FASTIO ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);
#define endl ' '

const int N = 200005;
int to[N];
int vis[N];
int parent[N];
int lifting[N][32];

int get(int u,int dis){
    if( lifting[u][dis]!=0 ) return lifting[u][dis];
    if( dis == 0 ) return lifting[u][dis] = to[u];
    else return lifting[u][dis] = get( get(u,dis-1),dis-1 );
}
void solve(){
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        int v;
        cin>>v;
        to[i] = v;
    }
    while(q--){
        int u,dis;
        cin>>u>>dis;
        int mul = 0;
        while(dis){
            if( dis%2 ){
                u = get(u,mul);
            }
            mul++;;
            dis/=2;
        }
        cout<<u<<endl;
    }
}

int main(){
    FASTIO;
    solve();
}