Pagini recente » Cod sursa (job #932675) | Cod sursa (job #2343578) | Cod sursa (job #2987391) | Cod sursa (job #193561) | Cod sursa (job #274220)
Cod sursa(job #274220)
#include<stdio.h>
#include<math.h>
#include<vector>
#define nmax 100010
using namespace std;
vector <int> v[nmax];
int nr, rang[nmax],w[nmax],buc[150],partial[nmax],el[nmax],ele[nmax];
void dfs(int a,int r)
{
w[nr++]=a;
rang[a]=r+1;
ele[a]=el[a];
for(int i=0;i<el[a];i++)
{
dfs(v[a][i],r+1);
ele[a]+=ele[v[a][i]];
}
}
int main()
{
int i,j,k,s,bucata,n,m,a,b,cod,sef,q;
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<n;i++)
{
scanf("%d %d",&a,&b);
v[a].push_back(b);
el[a]++;
}
dfs(1,0);
bucata=int(sqrt(n));
for(int f=1;f<=m;f++)
{
scanf("%d",&cod);
if (cod==1)
{
scanf("%d %d",&sef,&s);
for(i=0;i<n;i++)
if(w[i]==sef) break;
partial[i]+=s;
q=ele[sef];
for(j=i+1;j<bucata*((i/bucata)+1) && rang[j]>rang[i] ;j++, q-- )
partial[j]+=s;
if(j==bucata*((i/bucata)+1))
{
for(j=bucata*((i/bucata)+1)+1 ; q>0 ;j++,q--)
{
if(rang[j]==rang[i]) break;
if(j%bucata==0)
buc[j/bucata-1]+=s;
}
for(k=bucata*(j/bucata);q>0;k++,q--)
partial[k]+=s;
}
}
else
{
scanf("%d",&s);
for(i=0;i<n;i++)
{
if(partial[i]+buc[i/bucata]==s)
{
printf("%d\n",w[i]);
break;
}
}
if(i==n)printf("-1\n");
}
}
return 0;
}