Pagini recente » Cod sursa (job #2967446) | Cod sursa (job #1101341) | Cod sursa (job #1398808) | Cod sursa (job #2313762) | Cod sursa (job #103)
Cod sursa(job #103)
#include <stdio.h>
#define MAX 300005
class List
{
public:
struct nod
{
long x;
nod* next;
} *top;
long nr;
void init()
{
top=NULL;
nr=0;
}
void push(long x)
{
nod *aux=new nod;
aux->x=x;
aux->next=top;
top=aux;
nr++;
}
long pop()
{
if (nr>0)
{
long x=top->x;
nod *aux=top->next;
delete top;
nr--;
top=aux;
return x;
}
return -1;
}
} y[MAX];
long m,n,i,j,k,l;
long x[MAX];
List z[MAX];
List str[MAX]; //stramosi
long st[MAX];
int main()
{
freopen("stramosi.in","rt",stdin);
freopen("stramosi.out","wt",stdout);
scanf("%ld %ld",&n,&m);
for (i=1;i<=n;i++)
{
y[i].init();
z[i].init();
str[i].init();
}
for (i=1;i<=n;i++)
{
scanf("%ld",&x[i]);
if (x[i]) y[x[i]].push(i);
}
long m1[MAX],m2[MAX];
for (i=0;i<m;i++)
{
scanf("%ld %ld",&m1[i],&m2[i]);
z[m1[i]].push(m2[i]); //cererile pt acelasi nod se vor memora invers
//cererilor, iar la gen sol se vor inversa din
//nou. Astfel solutia va fi afisata bine.
}
for (i=1;i<=n;i++)
if (x[i]==0)
{
st[0]=l=i;k=1;
str[i].init();
while (z[i].nr>0)
{
j=z[i].pop();
str[i].push(0);
}
while (k>0)
{
if (y[l].nr>0)
{
st[k]=y[l].pop();
while (z[st[k]].nr>0)
{
j=z[st[k]].pop();
if (k<j) str[st[k]].push(0);
else str[st[k]].push(st[k-j]);
}
l=st[k];
k++;
}
else
{
k--;
st[k]=0;
l=st[k-1];
}
}
}
for (i=0;i<m;i++)
printf("%ld\n",str[m1[i]].pop());
return 0;
}