Cod sursa(job #348763)

Utilizator katakunaCazacu Alexandru katakuna Data 16 septembrie 2009 19:38:35
Problema Arbore Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <cstdio>
#include <vector>
#include <math.h>
using namespace std;

#define Nmax 100010

int n, m, x, y, i, tip, p, s, rad, l, strad, drrad;
int viz[Nmax], nr[Nmax], poz[Nmax], v[Nmax], a[Nmax], b[350], da[400], P[320][34000];
char da2[1000010];
vector <int> V[Nmax];

void DFS (int nod) {

	v[++v[0]] = nod; poz[nod] = v[0]; viz[nod] = 1; nr[nod] = 1;
	int i;
	for (i = 0; i < (int)V[nod].size(); i++)
		if ( !viz[ V[nod][i] ] ) {
			DFS (V[nod][i]);
			nr[nod]+= nr[ V[nod][i] ];
		}

}

void update (int p, int s) {
	
	int irad, st = poz[p], dr = st + nr[p] - 1, NR = rad, i;
	
	for (irad = 1; st > NR ; irad++, NR+= rad);
	strad = irad;
	
	for (irad = irad, NR = irad * rad; dr > NR ; irad++, NR+= rad);
	drrad = irad;
	
	if (strad == drrad) { 
		da[0] = 0;
		for (i = (strad - 1)*rad + 1 ; i < st; i++) {
			da[++da[0]] = a[i];
			da2[a[i]] = 1;
		}
		
		l = strad * rad;
		for (i = dr + 1 ; i <= l && i <= n ; i++) {
			da[++da[0]] = a[i];
			da2[a[i]] = 1;
		}
		
		for (i = st; i <= dr; i++){
			if ( !da2[ a[i] ] ) P[strad][a[i]] = 0;
			a[i]+= s;
			P[strad][a[i]] = 1;
		}
		
		for (i = 1; i <= da[0]; i++)
			da2[ da[i] ] = 0;
		
	}
	
	else {
		
		da[0] = 0;
		for (i = (strad - 1)*rad + 1 ; i < st; i++) {
			da[++da[0]] = a[i];
			da2[a[i]] = 1;
		}
		
		l = strad * rad;
		for (i = st; i <= l; i++) {
			if ( !da2[ a[i] ] ) P[strad][a[i]] = 0;
			a[i]+= s;
			P[strad][a[i]] = 1;
		}
		
		for (i = 1; i <= da[0]; i++)
			da2[ da[i] ] = 0;
		
		for (irad = strad + 1; irad <= drrad - 1; irad++)
			b[irad]+= s;
		
		
		da[0] = 0;
		l = strad * rad;
		for (i = dr + 1 ; i <= l && i <= n ; i++) {
			da[++da[0]] = a[i];
			da2[a[i]] = 1;
		}
		
		l = (drrad - 1) * rad + 1;
		for (i = l; i <= dr; i++) {
			if ( !da2[ a[i] ] ) P[drrad][a[i]] = 0;
			a[i]+= s;
			P[drrad][a[i]] = 1;
		}
		
		for (i = 1; i <= da[0]; i++)
			da2[ da[i] ] = 0;
	}
	
}

int query (int s) {
	
	int irad, i;
	for (irad = 1; irad <= rad + 1; irad++)
		if ( s - b[irad] > 0 && P[irad][ s - b[irad] ] ) {
			l = irad * rad;
			for (i = (irad-1) * rad + 1; i <= l; i++)
				if (a[i] == s - b[irad])
					return v[i];
		}
	
	return -1;
}

int main () {
	
	FILE *f = fopen ("arbore.in", "r");
	FILE *g = fopen ("arbore.out", "w");

	fscanf (f, "%d %d", &n, &m);
	for (i = 1; i < n; i++) {
		fscanf (f, "%d %d", &x, &y);
		V[x].push_back (y);
		V[y].push_back (x);
	}
	
	DFS(1);
	rad = (int)sqrt((double) n);
	
	for (i = 1; i <= rad + 1; i++)
		//P[i][0] = 1;
	
	for (i = 1; i <= m; i++ ){
		fscanf (f, "%d", &tip);
		
		if (tip == 1) {fscanf (f, "%d %d", &p, &s); update(p, s); }
		else {fscanf (f, "%d", &s); fprintf (g, "%d\n", query(s)); }
		
	}
	
	fclose (f);
	fclose (g);
	
	return 0;

}