Pagini recente » Cod sursa (job #2202960) | Cod sursa (job #1979018) | Cod sursa (job #1631528) | Cod sursa (job #2111692) | Cod sursa (job #1563953)
#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;
}