Cod sursa(job #1453234)

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

#define MAXN 250005
var PathP[MAXN], Pos[MAXN];
vector<var> Paths[MAXN];
var In[MAXN];
var paths = 0;



void addTo(var node, var path) {
    In[node] = path;
    Pos[node] = Paths[path].size();
    Paths[path].push_back(node);
}

void add(var node, var father) {
    if(Pos[father] == Paths[In[father]].size() - 1)
        addTo(node, In[father]);
    else {
        addTo(node, ++paths);
        PathP[paths] = father;
    }
}

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

vector<var> G[MAXN];
void dfs(var node) {
    for(auto vec : G[node]) {
        add(vec, node);
        dfs(vec);
    }
}

int main() {
    var n, m, type, x, y, cur = 0;
    fin>>n>>m;

    addTo(0, 0);

    var p;

    var root = 1;
    for(var i=1; i<=n; i++) {
        fin>>p;
        G[p].push_back(i);
    }
    dfs(0);

    while(m--) {
        fin>>x>>y;
        fout<<query(x, y)<<'\n';
    }

    return 0;
}