Cod sursa(job #643108)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 2 decembrie 2011 22:26:12
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<fstream>
#include<vector>
#define NMAX 100100
using namespace std;
vector <int> A[NMAX];
int n,radacina,v[NMAX],sol[NMAX],drum[NMAX];
///////////////////////
#define MaxBuffer 8192
char buffer[MaxBuffer];
int bufferIndex=8191;
///////////////////////
inline void read_buffer(istream& in,int& x) {
	do {if(++bufferIndex==MaxBuffer) {
		bufferIndex=0;
		in.read(buffer,MaxBuffer);
		}
	}while( buffer[bufferIndex]<'0'||buffer[bufferIndex]>'9' );
 
	for(x=0;buffer[bufferIndex]>='0'&&buffer[bufferIndex]<= '9';) {
		x=x*10+buffer[bufferIndex]-'0';
		if(++bufferIndex==MaxBuffer) {
			bufferIndex=0;
			in.read(buffer,MaxBuffer);
			}
		}
}
void afis() {
	int i;
	ofstream out("cerere.out");
	for(i=1;i<=n;i++)
		out<<sol[i]<<' ';
	out<<'\n';
	out.close();
}
void dfs(int nod,int nivel) {
	unsigned int i,j;
	drum[nivel]=nod;
	if(v[nod]==0)
		sol[nod]=0;
	else
		sol[nod]=sol[drum[nivel-v[nod]]]+1;
	for(i=0;i<A[nod].size();i++) {
		j=A[nod][i];
		dfs(j,nivel+1);
		}
}
void citire() {
	int i,x,y;
	ifstream in("cerere.in");
	read_buffer(in,n);
	for(i=1;i<=n;i++)
		read_buffer(in,v[i]);
	radacina=n*(n+1)>>1;
	for(i=1;i<n;i++) {
		read_buffer(in,x);
		read_buffer(in,y);
		A[x].push_back(y);
		radacina-=y;
		}
	in.close();
}
int main() {
	citire();
	dfs(radacina,1);
	afis();
	return 0;
}