Cod sursa(job #1046206)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 2 decembrie 2013 19:15:45
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector <int> fii[400002];
vector <pair <int,int> > res[400002];
vector <int> stiva;
int n,nq,i,j,nr,q,p,s,r[400002];
void go(int nod)
{
    int s=res[nod].size();
    int szst=stiva.size();

    for (int i=0;i<s;i++)
        if (res[nod][i].first>szst)
            res[nod][i].first=0;
        else
            res[nod][i].first=stiva[szst-res[nod][i].first];

    stiva.push_back(nod);
    s=fii[nod].size();

    for (int i=0;i<s;i++)
        go(fii[nod][i]);

    stiva.pop_back();
}
int main(void)
{
    FILE * f;
    f=fopen("stramosi.in","r");
    ofstream g("stramosi.out");

    fscanf(f,"%d%d",&n,&nq);

    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&nr);
        fii[nr].push_back(i);
    }

    for (i=1;i<=nq;i++)
    {
        fscanf(f,"%d%d",&q,&p);
        res[q].push_back(make_pair(p,i));
    }

    s=fii[0].size();
    for (i=0;i<s;i++)
        go(fii[0][i]);

    for (i=1;i<=n;i++)
    {
        s=res[i].size();
        for (j=0;j<s;j++)
            r[res[i][j].second]=res[i][j].first;
    }
    for (i=1;i<=nq;i++)
        g<<r[i]<<'\n';

    return 0;
}