Cod sursa(job #831465)

Utilizator geniucosOncescu Costin geniucos Data 8 decembrie 2012 17:51:02
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<cstdio>
#include<vector>
using namespace std;
int que,n,i,j,pp,p,a1,b1,i1,l,st[250005],rez[300005],t[250005];
char sir[1750009];
vector < int > v[250005];
vector < int > qq[250005];
vector < int > qp[250005];
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d %d\n",&n,&que);
gets(sir+1);
pp=1;
for(i=1;i<=n;i++)
{
    p=0;
    while(sir[pp]>='0'&&sir[pp]<='9')
    {
        p=p*10+sir[pp]-48;
        pp++;
    }
    pp++;
    t[i]=p;
    v[p].push_back(i);
}
//////////////////////////tin minte query-le
for(i=1;i<=que;i++)
{
    gets(sir+1);
    pp=1;
    a1=0;
    while(sir[pp]!=' ')
    {
        a1=a1*10+sir[pp]-48;
        pp++;
    }
    pp++;
    b1=0;
    while(sir[pp]>='0'&&sir[pp]<='9')
    {
        b1=b1*10+sir[pp]-48;
        pp++;
    }
    qq[a1].push_back(b1);
    qp[a1].push_back(i);
}
////////////////////////////////dfs+aflat raspunsuri
for(i1=1;i1<=n;i1++)
    if(t[i1]==0)
    {
        l=1;
        st[1]=i1;
        for(j=0;j<qq[st[l]].size();j++)
        {
            if(l<=qq[st[l]][j]) rez[qp[st[l]][j]]=0;
            else rez[qp[st[l]][j]]=st[l-qq[st[l]][j]];
        }
        while(l>0)
        {
            if(v[st[l]].empty()) l--;
            else
            {
                l++;
                st[l]=v[st[l-1]][0];
                v[st[l-1]].erase(v[st[l-1]].begin());
                for(j=0;j<qq[st[l]].size();j++)
                {
                    if(l<=qq[st[l]][j]) rez[qp[st[l]][j]]=0;
                    else rez[qp[st[l]][j]]=st[l-qq[st[l]][j]];
                }
            }
        }
    }
////////////////////////afis
for(i=1;i<=que;i++)
    printf("%d\n",rez[i]);
return 0;
}