Cod sursa(job #662469)

Utilizator bacilaBacila Emilian bacila Data 16 ianuarie 2012 19:04:52
Problema Arbore Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.26 kb
#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);
     }
     if(st!=dr)
     sum[nod]=max(sum[nod*2],sum[nod*2+1])+up[nod];
     else
     sum[nod]=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
if(st!=dr)
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;
}