Cod sursa(job #981396)

Utilizator raulstoinStoin Raul raulstoin Data 7 august 2013 00:18:01
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
#include<vector>

#define VAL val[line[i]]
#define NMAX 100005

using namespace std;

ifstream fin("arbore.in");
ofstream fout("arbore.out");

int n,m;
vector<int> G[NMAX],line;
int val[2*NMAX],first[NMAX],last[NMAX];

//
const int SZ=10000;
char input[SZ+1],*in;
 
int atoi()
{
    int nr =0;
    for(;!(*in>='0' && *in<='9') && *in;in++);
 
    if(!*in)
    {
		memset(input,0,sizeof input);
        fin.read(input,SZ);
        in=input;
        for(;!(*in>='0' && *in<='9') && *in;in++);
    }
    for(;*in>='0' && *in<='9';in++)
    {
        nr=nr*10+(*in-'0');
        if(!*(in+1))
        {
			memset(input,0,sizeof input);
            fin.read(input,SZ);
            in=input-1;
        }
    }
    return nr;
}
//

void read()
{
	fin.read(input,SZ);
	in=input;
	n=atoi();
	m=atoi();
	for(int i=1,x,y;i<n;i++)
	{
		x=atoi();
		y=atoi();
		G[x].push_back(y);
		G[y].push_back(x);
	}
}

void DFS(int nod,int tt)
{
	line.push_back(nod);
	first[nod]=line.size()-1;
	for(size_t i=0;i<G[nod].size();i++)
		if(G[nod][i]!=tt)
			DFS(G[nod][i],nod);
	line.push_back(nod);
	last[nod]=line.size()-1;
}

void solve()
{
	DFS(1,0);
	for(int i,aux,choice,x,y;m;m--)
	{
		choice=atoi();
		x=atoi();
		if(choice==1)
		{
			y=atoi();
			val[x]+=y;
			continue;
		}
		for(i=0,aux=0;i<2*n;i++)
		{
			if(first[line[i]]==i)
				aux+=val[line[i]];
			if(last[line[i]]==i)
				aux-=val[line[i]];
			if(aux==x)
				break;
		}
		if(i==n)
			fout<<"-1\n";
		else
			fout<<line[i]<<'\n';
	}
}

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