Pagini recente » Cod sursa (job #2178372) | Cod sursa (job #1508047) | Cod sursa (job #842458) | Cod sursa (job #1844367) | Cod sursa (job #1463973)
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <vector>
using namespace std;
int N,M;
vector <int> Graf[100100];
bool uz[100100];
int v[200100],nr1,stg[100100],drt[100100],k,ind,val;
struct Interval
{
int suma,maxim;
}Arb[1100000];
int x,y,op;
void Liniarizare(int x)
{
uz[x]=true;
v[++k]=x;
stg[x]=k;
for(vector<int>::iterator it=Graf[x].begin();it!=Graf[x].end();it++)
if(uz[*it]==false)
Liniarizare(*it);
v[++k]=x;
drt[x]=k;
}
void Update(int nod,int st,int dr)
{
if(st>=stg[ind] && dr<=drt[ind])
Arb[nod].suma=Arb[nod].suma+val;
else
{
int mij=(st+dr)/2;
if(stg[ind]<=mij)
Update(2*nod,st,mij);
if(mij+1<=drt[ind])
Update(2*nod+1,mij+1,dr);
}
Arb[nod].maxim=Arb[nod].suma+max(Arb[2*nod].maxim,Arb[2*nod+1].maxim);
}
void Query(int nod,int st,int dr,int S)
{
if(ind>=1)
return;
if(Arb[nod].suma==S)
{
ind=v[st];
return;
}
if(st<dr && Arb[nod].suma<S && Arb[nod].maxim>=S)
{
int mij=(st+dr)/2;
Query(2*nod,st,mij,S-Arb[nod].suma);
Query(2*nod+1,mij+1,dr,S-Arb[nod].suma);
}
}
void Solve()
{
ifstream g("arbore.in");
ofstream f("arbore.out");
g>>N>>M;
for(int i=1;i<N;i++)
{
g>>x>>y;
Graf[x].push_back(y);
Graf[y].push_back(x);
}
Liniarizare(1);
for(int i=1;i<=M;i++)
{
g>>op;
if(op==1)
{
g>>ind>>val;
Update(1,1,k);
}
else
{
g>>val;
ind=-1;
Query(1,1,k,val);
f<<ind<<"\n";
}
}
}
int main()
{
Solve();
}