Cod sursa(job #1220187)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 16 august 2014 18:39:06
Problema Arbore Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<bitset>
#include<math.h>
using namespace std;

#define NMAX 100010
#define RMAX 325

vector <int> v[NMAX];
int st[NMAX],dr[NMAX],viz[NMAX],a[NMAX],c[NMAX],l[NMAX],r[NMAX],b[NMAX],poz[NMAX],nr;
bitset <RMAX> p[1000001];

void dfs(int nod)
{
	viz[nod]=1;
	nr++;
	st[nod]=nr;
	b[nr]=nod;
	for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
		if(viz[*it]==0)
			dfs(*it);
	dr[nod]=nr;
}

void buildsqrt(int n)
{
	int i,R;
	nr=0;
	R=sqrt(n);
	for(i=1;i<=n;i++) {
		if(i%R==1) {
			nr++;
			l[nr]=i;
			r[nr-1]=i-1;
			p[nr][0]=1;
		}
		poz[i]=nr;
	}
	r[nr]=n;
}

void interval(int poz1, int poz2, int sum)
{
	int k,i;
	k=poz[poz1];
	for(i=l[k];i<=r[k];i++)
		p[k][a[i]]=0;
	for(i=poz1;i<=poz2;i++)
		a[i]=a[i]+sum;
	for(i=l[k];i<=r[k];i++)
		p[k][a[i]]=1;
}
void update(int poz1, int poz2, int sum)
{
	int k;
	if(poz[poz1]==poz[poz2]) {
		interval(poz1,poz2,sum);
		return ;
	}
	interval(poz1,r[poz[poz1]],sum);
	for(k=poz[poz1]+1;k<=poz[poz2]-1;k++)
		c[k]=c[k]+sum;
	interval(l[poz[poz2]],poz2,sum);
}

int query(int val)
{
	int k,i;
	for(k=1;k<=nr;k++) {
		if(c[k]>val)
			continue;
		if(p[k][val-c[k]]) {
			for(i=l[k];i<=r[k];i++)
				if(a[i]==val-c[k])
					return b[i];
		}
	}
	return -1;
}

int main  ()
{
	int n,x,y,m,op,i;
	ifstream f("arbore.in");
	ofstream g("arbore.out");
	f>>n>>m;
	for(i=1;i<=n-1;i++) {
		f>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(1);
	buildsqrt(n);
	while(nr>=325);
	for(i=1;i<=m;i++) {
		f>>op;
		if(op==1) {
			f>>x>>y;
			update(st[x],dr[x],y);
		}
		else {
			f>>x;
			g<<query(x)<<'\n';
		}
	}
	f.close();
	g.close();
	return 0;
}