Pagini recente » Cod sursa (job #3001952) | Cod sursa (job #2322298) | Cod sursa (job #699885) | Cod sursa (job #3129685) | Cod sursa (job #190682)
Cod sursa(job #190682)
#include <vector>
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
#define pb push_back
#define p push
#define fori(c,it) for(vector<int>::iterator it = (c).begin(); it != (c).end(); it++)
queue<int> coada;
vector<vector<int> > a(250005),b(250005);
int put[250005],stra[250005],log[35];
char s[250000*7+3];
int nr;
int main()
{
FILE *in,*out;
int i,n,m,j,x,y;
in=fopen("stramosi.in","r");
out=fopen("stramosi.out","w");
fscanf(in,"%d%d\n",&n,&m);
fgets(s+1,250000 *7+3,in);
i=1;
nr=0;
x=0;
y=strlen(s+1);
while (i<=y)
{
if (s[i]>='0'&&s[i]<='9')
{
x=x*10+s[i]-'0';
}
else
if (s[i-1]>='0'&&s[i-1]<='9')
{
nr++;
stra[nr]=x;
if(!stra[nr])
coada.p(nr);
else
b[stra[nr]].pb(nr);
x=0;
}
++i;
}
/* for (i=1;i<=n;i++)
{
fscanf(in,"%d",&stra[i]);
if(!stra[i])
coada.p(i);
else
b[stra[i]].pb(i);
}
while (!coada.empty())
{
printf("%d ",coada.front());
coada.pop();
}*/
put[1]=0;
x=2;
y=1;
for (i=2;i<=n;++i)
{
if (i==x)
{
x*=2;
++y;
}
put[i]=y-1;
}
log[0]=1;
for (i=1;i<=put[n];++i)
log[i]=2*log[i-1];
while (!coada.empty())
{
x=coada.front();
// printf("%d\n",x);
coada.pop();
for(vector<int>::iterator it=b[x].begin();it!=b[x].end();++it)
{
coada.p(*it);
a[*it].pb(x);
for (j=1;a[a[*it][j-1]].size()>j-1;++j)
{
a[*it].pb(a[a[*it][j-1]][j-1]);
}
}
}
for (i=1;i<=m;++i)
{
fscanf(in,"%d%d",&y,&x);
while (x)
{
if (put[x]>=a[y].size())
{
fprintf(out,"0\n");
break;
}
y=a[y][put[x]];
x-=log[put[x]];
}
if (!x)
fprintf(out,"%d\n",y);
}
fclose(in);
fclose(out);
return 0;
}