Cod sursa(job #1341588)

Utilizator retrogradLucian Bicsi retrograd Data 12 februarie 2015 21:57:00
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<fstream>
#include<vector>

using namespace std;
typedef int var;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

const var MAXN = 250001;
const var MAXM = 300001;

//var PARENT[MAXN];

//var B[MAXN];
var D[MAXN], PARENTP[MAXN], P[MAXM], ANS[MAXM];
vector<bool> VIZ(MAXN);

vector<var> QIND[MAXN];
vector<var> G[MAXN];


void solveQueries(var node) {

    for(vector<var>::iterator it = QIND[node].begin(); it != QIND[node].end(); ++it) {
        var &qind = *it;
        var &ans = ANS[qind];
        if(D[node] < P[qind]) {
            ans = 0;
        } else {
            ans = PARENTP[D[node]-P[qind]];
        }
    }

}


var t=0;
var dfs(var node) {
    VIZ[node] = 1;
    //B[++t] = node;
    PARENTP[D[node]] = node;

    //Rezolv toate query-urile adresate lui node
    solveQueries(node);

    //Dupa df normal
    for(vector<var>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
        //if(!VIZ[*it]) {
            D[*it] = D[node] + 1;
            dfs(*it);
        //}
    }
}

int main() {
    var n, m, p, q;

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

    for(var i=1; i<=m; i++) {
        fin>>q>>P[i];
        QIND[q].push_back(i);
    }

    for(var i=1; i<=n; i++) {
        if(!VIZ[i]) {
            dfs(i);
        }
    }

    for(var i=1; i<=m; i++) {
        fout<<ANS[i]<<'\n';
    }

    return 0;
}