Pagini recente » Cod sursa (job #405119) | Cod sursa (job #491813) | Cod sursa (job #2438381) | Cod sursa (job #2640674) | Cod sursa (job #662460)
Cod sursa(job #662460)
#include <fstream>
#include<vector>
using namespace std;
ofstream g("arbore.out");
int start[100003],n,m,stop[100003],k,x,y,up[400003],sum[400003],eu[100003];
bool viz[100003],ok;
vector<int> v[100001];
void update(int st, int dr,int nod)
{if(start[x]<=st&&dr<=stop[x]) {up[nod]+=y;}
else
{if(start[x]<=(dr+st)/2)
update(st,(st+dr)/2,nod*2);
if((st+dr)/2<stop[x])
update((st+dr)/2+1,dr,nod*2+1);
}
sum[nod]=max(sum[nod*2],sum[nod*2+1])+up[nod];
}
void query(int st, int dr, int nod){x-=up[nod];
if(ok&&x<=sum[nod]&&x>=0)
{
if(x==0){
g<<eu[st]<<'\n'; ok=false;}
else
{query(st,(st+dr)/2,nod*2);
if(ok)query((st+dr)/2+1,dr,nod*2+1);
}
}
x+=up[nod]; }
void dfs(int nod)
{viz[nod]=true;
if(!start[nod]) start[nod]=++k; eu[k]=nod;
for(int i=0;i<v[nod].size();i++)
if(!viz[v[nod][i]])
dfs(v[nod][i]);
stop[nod]=k;
}
int main ()
{int i;
ifstream f("arbore.in");
f>>n>>m;
for(i=1;i<n;i++)
{f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);}
dfs(1);
for(i=1;i<=m;i++)
{f>>x;
if(x%2)
{
f>>x>>y;
update(1,n,1);
}
else
{ f>>x; ok=true;
query(1,n,1);
if(ok) g<<-1<<'\n';
}}
f.close(); g.close();
return 0;
}