Pagini recente » Cod sursa (job #2237475) | Cod sursa (job #2227245) | Cod sursa (job #2243514) | Cod sursa (job #2281325) | Cod sursa (job #190664)
Cod sursa(job #190664)
#include <vector>
#include <stdio.h>
#include <queue>
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];
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,&m);
for (i=1;i<=n;i++)
{
fscanf(in,"%d",&stra[i]);
if(!stra[i])
coada.p(i);
else
b[stra[i]].pb(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++)
printf("%d ",put[i]);
printf("\n");
while (!coada.empty())
{
x=coada.front();
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;j<=a[x].size();j++)
{
a[*it].pb(a[a[*it][j-1]][j-1]);
}
}
}
for (i=1;i<=n;i++)
{
for(vector<int>::iterator it=a[i].begin();it!=a[i].end();it++)
printf("%d ",*it);
printf("\n");
}
for (i=1;i<=m;i++)
{
fscanf(in,"%d%d",&y,&x);
while (x)
{
printf("%d %d %d %d\n",x,y,put[x],(int)a[y].size());
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;
}