Cod sursa(job #350024)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 22 septembrie 2009 13:34:46
Problema Arbore Scor 95
Compilator cpp Status done
Runda Lista lui wefgef Marime 4 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <iomanip>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>

#define pb push_back
#define size(V) ((int)(V.size()))
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair
#define mod 654321
#define oo 1<<30

#define IN  "arbore.in"
#define OUT "arbore.out"
#define N_MAX 1<<17
#define bit(x) (1<<((x) & 31))

typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;
template<class T> string toString(T n) {ostringstream ost;ost<<n;ost.flush();return ost.str();}
typedef vector<string> VS;

VI A[N_MAX];
int topSol(-1),Q0,Rk,K,N,M,Sqrt = 1;
int P[1<<20],P1[N_MAX],P2[N_MAX],S[1<<18],LSqrt[N_MAX],SSqrt[N_MAX],Q[1<<18];
vector<bool> viz(N_MAX);
int B[1<<9][1<<15];
char buffer[1<<22];

II void read(int &aux)
{
	aux = 0;
	for(;buffer[Rk] < '0' || buffer[Rk] > '9';++Rk);
	for(;buffer[Rk] >= '0' && buffer[Rk] <= '9';++Rk)
		aux = aux * 10 + buffer[Rk] - '0';
}

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	fread(buffer,1,1<<22,stdin);
	
	read(N),read(M);
	
	int x,y;
	FOR(i,1,N-1)
	{
		read(x);read(y);
		A[x].pb(y);
		A[y].pb(x);
	}
}

II void DF(int nod)
{
	viz[nod] = true;
	bool ok(false);
	
	Q[++Q0] = nod;
	P1[nod] = Q0;
	
	for(VI::iterator it=A[nod].begin();it != A[nod].end();++it)
	{
		if(viz[*it])
			continue;
		DF(*it);
		ok = true;
	}	
	
	if(ok) Q[++Q0] = nod;
	P2[nod] = Q0+1;
}

II void update(int p,int s)
{
	int sum,aux;
	int p1 = P1[p] / Sqrt;
	int p2 = P2[p] / Sqrt;
	
	FOR(i,p1+1,p2) SSqrt[i] += s;
	
	sum = LSqrt[p1];
	LSqrt[p1] += SSqrt[p1];	
	SSqrt[p1] = 0;
	
	aux = Sqrt * p1;
	FOR(i,aux,aux + Sqrt - 1)
	{
		sum += S[i];
		B[p1][sum >> 5] = 0; 
	}
	
	S[ P1[p] ] += s;
	if(p1==p2) S[ P2[p] ] -= s;
	
	sum = LSqrt[p1];
	FOR(i,aux,aux + Sqrt - 1)
	{
		sum += S[i];
		if(i) P[sum] = p1;
		B[p1][sum >> 5] |= bit(sum); 
	}

	if(p1==p2)
		return;
	
	sum = LSqrt[p2];
	LSqrt[p2] += SSqrt[p2];	
	SSqrt[p2] = 0;
	
	aux = Sqrt * p2;
	FOR(i,aux,aux + Sqrt - 1)
	{
		sum += S[i];
		B[p2][sum >> 5] = 0; 
	}
	
	S[ P2[p] ] -= s;
	
	sum = LSqrt[p2];
	FOR(i,aux,aux + Sqrt - 1)
	{
		sum += S[i];
		if(i) P[sum] = p2;
		B[p2][sum >> 5] |= bit(sum); 
	}
}

II int querry(int s)
{
	int sum(0),p = P[s];
	if( (B[p][(s - SSqrt[p]) >> 5] & bit(s - SSqrt[p])) )
		FOR(i,Sqrt * p,Sqrt * (p + 1) - 1)
		{
			sum += S[i];
			if(i && sum + SSqrt[p] + LSqrt[p] == s)
				return Q[i];
		}	
	int aux = Q0 / Sqrt; //se pare ca asa merge mai repdede
	FOR(p,0,aux)
		if( B[p][(s - SSqrt[p]) >> 5] & bit(s - SSqrt[p]) )
		{
			sum = SSqrt[p] + LSqrt[p];
			FOR(i,Sqrt * p,Sqrt * (p + 1) - 1)
			{
				sum += S[i];
				P[sum] = p;
				if(i && sum == s)
					return Q[i];
			}	
		}
	return -1;	
}

II void ToSchar(int aux)
{
	if(aux == -1) 
	{
		buffer[++topSol] = '-';
		buffer[++topSol] = '1';
	}
	else
	{
		int last =  topSol;
		for(;aux;buffer[++topSol] = aux % 10 + '0',aux /= 10);
		reverse(buffer+last+1,buffer+topSol+1);
	}
	buffer[++topSol] = '\n';
}

II void solve()
{
	DF(1);
	Q[++Q0] = -1;
	
	for(;Sqrt * Sqrt < Q0;++Sqrt);
	
	FOR(i,0,Q0 / Sqrt)
		B[i][0] |= bit(0);
	
	int tip,p,sum;
	FOR(i,1,M)
	{
		read(tip);
		
		if(tip == 1)
		{
			read(p);read(sum);
			update(p,sum);
			continue;
		}	
		
		read(sum);
	//	rezS += querry(s);
		ToSchar( querry(sum) );
	}
	buffer[++topSol] = '\0';
	
	printf("%s\n",buffer);
//	printf("Time : %d ms\n",clock() );
}

int main()
{
	scan();
	solve();
	return 0;
}