Cod sursa(job #5481)

Utilizator nemesisIchim Alexandru Eugen nemesis Data 12 ianuarie 2007 19:00:38
Problema Stramosi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>
#include<stdlib.h>
#define maxn 250001

int n, nrq, *a[maxn], *rad, xx[maxn], nr, rez[maxn+50000];
struct nod { int val; int ord; } ;
struct intreb { 
  int nr;
  nod *a;  
} q[maxn];
bool viz[maxn];

void BFS(int k)
{
  viz[k]=1;
  while( q[k].nr ) {
    if( nr- q[k].a[ q[k].nr].val) rez[ q[k].a[ q[k].nr].ord]= xx[nr- q[k].a[ q[k].nr].val];
    else rez[ q[k]. a[ q[k].nr].ord]= 0;
    q[k].nr--;
  }
  for(int i=1; i<=a[k][0]; ++i) if(!viz[a[k][i]]) {
    xx[++nr]= a[k][i];
    BFS(a[k][i]);
  }
  nr--;
}

int main()
{
  int i, x, y;
  FILE *f=fopen("stramosi.in","r");
  fscanf(f,"%d %d",&n,&nrq);
  for(i=0; i<=n+2; ++i) {
    a[i]=(int*)malloc(sizeof(int));
    a[i][0]=0;
  }
  rad=(int*)malloc(sizeof(int));
  rad[0]=0;
  for(i=1; i<=n; ++i) {
    fscanf(f,"%d",&x);
    a[x][0]++;
    a[x]=(int*)realloc(a[x], sizeof(int)*(a[x][0]+2));
    a[x][ a[x][0]]= i;
    if(!x) {
      rad[0]++;
      rad=(int*)realloc(rad, sizeof(int)*(rad[0]+2));
      rad[ rad[0]]= i;
      }
  }

  for(i=1; i<=nrq; ++i) { 
    fscanf(f,"%d %d",&x,&y);
    if( !q[x].nr) {
      q[x].nr++;
      q[x].a=(nod*)malloc(sizeof(nod)*2);      
      q[x].a[ q[x].nr].val=y;
      q[x].a[ q[x].nr].ord=i;
    }
    else {
      q[x].nr++;
      q[x].a=(nod*)realloc(q[x].a, sizeof(nod)*(q[x].nr+2));
      q[x].a[ q[x].nr].val=y;
      q[x].a[ q[x].nr].ord=i;
    }
  }
  fclose(f);

  for(i=1; i<=rad[0]; ++i) {
    nr=1;
    xx[nr]=rad[i];
    BFS( rad[i]);
  }
  FILE *g=fopen("stramosi.out","w");
  for(i=1; i<=nrq; ++i) fprintf(g,"%d\n",rez[i]);

  fclose(g);
  return 0;
}