Pagini recente » Cod sursa (job #376295) | Cod sursa (job #3152182) | Cod sursa (job #554993) | Cod sursa (job #1993301) | Cod sursa (job #1310504)
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
ifstream in("arbore.in");
ofstream out("arbore.out");
const int NMAX = 100000;
const int DMAX = NMAX * 10;
struct ang{
int number;
int sum;
};
vector<int> v[NMAX + 10];
vector<ang> hash[DMAX +10];
int tata[NMAX + 10],n,m,s,p,c[NMAX + 10];
void init_tata(int x)
{
queue<int> coada;
coada.push(x);
while(!coada.empty()){
int k = coada.front();
for(int i = 0 ; i < v[k].size() ; i++)
if(tata[v[k][i]] == 0){
tata[v[k][i]] = k;
coada.push(v[k][i]);
}
coada.pop();
}
}
void in_hash(int nod,int val)
{
ang nou;
nou.number = nod;
nou.sum = val;
hash[nou.sum].push_back(nou);
}
void scoate(int nod,int val)
{
for(int i = 0 ; i < hash[val].size() ; i++)
if(hash[val][i].number == nod)
hash[val].erase(hash[val].begin() + i);
}
int query(int val)
{
if(hash[val].size() == 0)
return -1;
return hash[val][0].number;
}
void citire()
{
in>>n>>m;
int a,b;
for(int i = 1 ; i < n ;i++){
in>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
in_hash(i,0);
}
in_hash(n,0);
tata[1] = -1;
init_tata(1);
}
void act(int nod,int suma)
{
scoate(nod,c[nod]);
c[nod] += suma;
in_hash(nod,c[nod]);
for(int i = 0 ; i < v[nod].size() ; i++)
if(tata[v[nod][i]] == nod)
act(v[nod][i],suma);
}
int main()
{
citire();
int tip,a,b;
for( ; m ; --m){
in>>tip;
if(tip == 1){
in>>a>>b;
act(a,b);
}
else{
in>>a;
out<<query(a)<<"\n";
}
}
return 0;
}