Pagini recente » Istoria paginii runda/trala/clasament | Cod sursa (job #961566) | Istoria paginii runda/ana-are-mere/clasament | Istoria paginii runda/simulare_oji_09 | Cod sursa (job #190714)
Cod sursa(job #190714)
#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++)
int put[250005],stra[250005],log[35],a[30][250005];
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;
x=0;
}
++i;
}
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];
for (i=1;i<=n;i++)
a[0][i]=stra[i];
for (i=1;i<=put[n];i++)
{
for (j=1;j<=n;j++)
a[i][j]=a[i-1][a[i-1][j]];
}
for (i=1;i<=m;++i)
{
fscanf(in,"%d%d",&y,&x);
while (x)
{
y=a[put[x]][y];
x-=log[put[x]];
}
fprintf(out,"%d\n",y);
}
fclose(in);
fclose(out);
return 0;
}