Cod sursa(job #392592)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 7 februarie 2010 19:57:31
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
# include <fstream.h>
ifstream f ("stramosi.in");
ofstream g ("stramosi.out");
int v[300005],i,j,n,m,x,y,s[300005],d[300005],q,r[300005],k,zx;

  struct nod 
  {
	  int info;
	  nod *urm;
  }*a[300005],*p;
  
  struct nod2
  {
	  int info,rez;
	  nod2 *urm;
  }*b[300005],*z;
  
   
    void df (int x)
	{
		k=1;
		v[k]=x;
		
		z=b[x];
		while (z)
		{
			zx=k-z->info;
			if (zx>0)
			z->rez=v[zx];
			else
				z->rez=0;
			z=z->urm;
		}
		
		while (k)
		{
			y=v[k];
			if (a[y])
			{
				y=a[y]->info;
				a[v[k]]=a[v[k]]->urm;
				k++;
				v[k]=y;
				
				
				
				z=b[y];
	        	while (z)
	        	{
			      zx=k-z->info;
			        if (zx>0)
			            z->rez=v[zx];
			         else
				        z->rez=0;
			         z=z->urm;
		        }
			}
			else
				k--;
		}
	}



int main ()
{
	f>>n>>m;
	for (i=1;i<=n;i++)
	{
		f>>x;
		if (x==0)
		{
			q++;
			r[q]=i;
		}
		else
		{
		p=new nod;
		p->info=i;
		p->urm=a[x];
		a[x]=p;
		}
	}
	
	for (i=1;i<=m;i++)
		f>>s[i]>>d[i];
	
	for (i=m;i>=1;i--)
	{
		z=new nod2;
		z->info=d[i];
		z->urm=b[s[i]];
		b[s[i]]=z;
	}

	
	for (j=1;j<=q;j++)
		df (r[j]);
	
	for (i=1;i<=m;i++)
	{
		g<<b[s[i]]->rez<<"\n";
		b[s[i]]=b[s[i]]->urm;
	}
	return 0;
}