Pagini recente » Cod sursa (job #894379) | Cod sursa (job #247401) | Cod sursa (job #2482173) | Cod sursa (job #1158220) | Cod sursa (job #662422)
Cod sursa(job #662422)
#include <fstream>
#include<vector>
using namespace std;
ofstream g("arbore.out");
int start[100003],n,m,stop[100003],k,x,y,up[200003],sum[200003];
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; if(sum[nod]<up[nod]) sum[nod]=up[nod];}
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]);
}
}
void query(int st, int dr, int nod){x-=up[nod];
if(ok&&x<=sum[nod])
{
if(st==dr){
if(!x){
g<<st<<'\n'; ok=false;}}
else
{query(st,(st+dr)/2,nod*2);
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;
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;
}