Cod sursa(job #1453238)

Utilizator retrogradLucian Bicsi retrograd Data 23 iunie 2015 03:14:56
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
typedef int var;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

#define MAXN 250001
vector<var> Paths[MAXN], G[MAXN];
var Pos[MAXN], In[MAXN], Heavy[MAXN], PathP[MAXN];
var paths;

void dfs(var node) {
    Heavy[node] = 1;
    In[node] = paths+1;
    var best = 0;
    for(auto vec : G[node]) {
        dfs(vec);
        Heavy[vec] += Heavy[node];
        PathP[In[vec]] = node;
        if(best < Heavy[vec]) {
            best = Heavy[vec];
            In[node] = In[vec];
        }
    }
    Paths[In[node]].push_back(node);
    paths = max(paths, In[node]);
}

var getParent(var node, var k) {
    while(true) {
        if(node == 0) return 0;
        if(k <= Pos[node]) return Paths[In[node]][Pos[node]-k];
        k -= Pos[node] + 1;
        node = PathP[In[node]];
    }
}

int main() {
    var n, m, p, a, b;
    fin>>n>>m;
    for(var i=1; i<=n; i++) {
        fin>>p;
        G[p].push_back(i);
    }
    dfs(0);
    for(var i=1; i<=paths; i++) {
        reverse(Paths[i].begin(), Paths[i].end());
        var j = 0;
        for(auto node : Paths[i]) Pos[node] = j++;
    }

    while(m--) {
        fin>>a>>b;
        fout<<getParent(a, b)<<'\n';
    }
}