Cod sursa(job #1193081)

Utilizator silvatheviprersilviu catioiu silvatheviprer Data 30 mai 2014 21:17:43
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <stdlib.h>
#define INF "stramosi.in"
#define OUF "stramosi.out"
#define NMAX 262144
int st[NMAX],sol[300001];
struct nod
{
    int c;
    nod *next;
};
struct nod2
{
    int c,poz;
    nod2 *next;
}*pr;
struct head
{
    nod *p,*q;
}la[NMAX];
struct head2
{
    nod2 *p,*q;
}lk[NMAX];

void dfs(nod *p,int k)
{
    while(p!=NULL)
    {
        st[k]=p->c;
        pr=lk[p->c].p;
        //printf("%d\n",st[k]);
        while(pr!=NULL)
        {
        //  printf("%d ",pr->c);
            if(k>=pr->c) sol[pr->poz]=st[k-(pr->c)];//warning
                  else sol[pr->poz]=0;
            pr=pr->next;
        }
        //printf("\n");
        dfs(la[p->c].p,k+1);
        p=p->next;
    }
}
void tipar(nod2 *p)
{
    while(p!=NULL) {printf("%d_%d ",p->c,p->poz);p=p->next;}
    printf("\n");
}
int main()
{
    int i,n,m,x,k;
    nod *op;
    nod2 *po;
    FILE *in,*out;
    in=fopen(INF,"r");
    out=fopen(OUF,"w");
    fscanf(in,"%d %d",&n,&m);
    for(i=1;i<=n;i++) {la[i].p=la[i].q=NULL;lk[i].p=lk[i].q=NULL;}
    for(i=1;i<=n;i++)
    {
        op=new nod;
        op->next=NULL;fscanf(in,"%d",&x);
        op->c=i;
        if(la[x].p==NULL){la[x].p=la[x].q=op;}
        else {la[x].q->next=op;la[x].q=op;}
    }
    for(i=1;i<=m;i++)
    {
           fscanf(in,"%d %d",&x,&k);
       po=new nod2;
       po->next=NULL;po->c=k;po->poz=i;
       if(lk[x].p==NULL){lk[x].p=lk[x].q=po;}
       else {lk[x].q->next=po;lk[x].q=po;};
    }
    dfs(la[0].p,1);
//  for(i=0;i<=n;i++) tipar(lk[i].p);
    for(i=1;i<=m;i++) fprintf(out,"%d\n",sol[i]);
    fclose(in);fclose(out);
    return 0;
}