Cod sursa(job #1438909)

Utilizator sanzianaioneteIonete Sanziana sanzianaionete Data 21 mai 2015 03:13:21
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int m,n,p,q;
bool viz[250004];
vector<int> a[250004],fii[250004], s,rad;
void df(int nod)
{
            int l=s.size(),p=1;
            s.push_back(nod);
            while((l-p)>=0)
            {
                a[nod].push_back(s[l-p]);
                p*=2;
            }
            l=fii[nod].size();
            for(int i=0;i<l;i++)
                df(fii[nod][i]);
            s.pop_back();
}
int stramos(int p, int q)
{
    int e=0;
    while(p&&e<a[q].size())
    {
        if(p%2)
        {
            q=a[q][e];
        }
            e++;
            p=p/2;
    }
    if(p!=0)
        return 0;
    return q;
}
/*int stramos(int p, int q)
{
    int e=0;
    while(p)
    {
        if((1<<e)>p)
        {
            if(e<=a[q].size())
            {
                q=a[q][e-1];
                e=0;
                p=p-(1<<(e-1));
            }
            else break;
        }
        else
            e++;
    }
    if(p)
        return 0;
    else
        return q;
}*/
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        f>>x;
        if(!x)
            rad.push_back(i);
        else
            fii[x].push_back(i);
    }
    int l=rad.size();
    for(int i=0;i<l;i++)
            df(rad[i]);
    for(int i=0;i<m;i++)
    {
        f>>q>>p;
        g<<stramos(p,q)<<"\n";
    }
    f.close();g.close();
    return 0;
}