Cod sursa(job #103)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 5 decembrie 2006 00:17:31
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#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;
}