Cod sursa(job #1563953)

Utilizator hrazvanHarsan Razvan hrazvan Data 7 ianuarie 2016 14:33:24
Problema Mese Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#define MAXN 100000
int v[MAXN];
int ult[MAXN], nod[2 * MAXN], next[2 * MAXN];
int rez, aux[MAXN], daux;

void qs(int st, int dr){
  int i = st, j = dr, piv = aux[(st + dr) / 2], ax;
  while(i <= j){
    while(aux[i] < piv)
      i++;
    while(aux[j] > piv)
      j--;
    if(i <= j){
      ax = aux[i];  aux[i] = aux[j];  aux[j] = ax;
      i++;  j--;
    }
  }
  if(st < j)
    qs(st, j);
  if(i < dr)
    qs(i, dr);
}

void rezolv(int x, int tata, int s){
  int poz = ult[x];
  while(poz != -1){
    if(nod[poz] != tata)
      rezolv(nod[poz], x, s);
    poz = next[poz];
  }
  daux = 0;
  poz = ult[x];
  while(poz != -1){
    if(nod[poz] != tata){
      aux[daux] = v[nod[poz]];
      daux++;
    }
    poz = next[poz];
  }
  qs(0, daux - 1);
  poz = 0;
  while(poz < daux && v[x] + aux[poz] <= s){
    v[x] += aux[poz];
    poz++;
  }
  rez += daux - poz;
}

int main(){
  FILE *in = fopen("mese.in", "r");
  int n, s, i, x, d = 0, sef;
  fscanf(in, "%d%d", &n, &s);
  memset(ult, -1, sizeof ult);
  for(i = 0; i < n; i++){
    fscanf(in, "%d%d", &x, &v[i]);
    if(x != 0){
      x--;
      nod[d] = i;
      next[d] = ult[x];
      ult[x] = d;
      d++;
      nod[d] = x;
      next[d] = ult[i];
      ult[i] = d;
      d++;
    }
    else
      sef = i;
  }
  fclose(in);
  rezolv(sef, -1, s);
  rez++;
  FILE *out = fopen("mese.out", "w");
  fprintf(out, "%d", rez);
  fclose(out);
  return 0;
}