Pagini recente » Cod sursa (job #799181) | Cod sursa (job #3161675) | Cod sursa (job #2290120) | Cod sursa (job #155907) | Cod sursa (job #1956582)
#include <bits/stdc++.h>
using namespace std;
int nr,k,add[100005],adbuc[100005],bucata[100005],ap[100005],vect[100005],inc[100005],fin[100005],st[100005],dr[100005],i,n,nrt,q,x,y;
bitset <100005> biti[320];
vector <int> v[100005];
void dfs(int nod)
{
int i;
ap[nod]=1;
nr++;
vect[nr]=nod;
inc[nod]=nr;
for(i=0;i<v[nod].size();i++)
if(ap[v[nod][i]]==0)dfs(v[nod][i]);
fin[nod]=nr;
}
void update_bucata(int bucata, int val)
{
int i;
for(i=(bucata-1)*k+1;i<=bucata*k;i++)
biti[bucata][add[i]]=val;
}
void update(int st, int dr, int val)
{
int i;
if(bucata[st]==bucata[dr])
{
update_bucata(bucata[st],0);
for(i=st;i<=dr;i++)
add[i]+=val;
update_bucata(bucata[st],1);
}
else
{
update_bucata(bucata[st],0);
update_bucata(bucata[dr],0);
for(i=st;i<=bucata[st]*k;i++)
add[i]+=val;
for(i=(bucata[dr]-1)*k+1;i<=dr;i++)
add[i]+=val;
update_bucata(bucata[st],1);
update_bucata(bucata[dr],1);
for(i=bucata[st]+1;i<=bucata[dr]-1;i++)
adbuc[i]+=val;
}
}
int query(int s)
{
int i,j;
for(i=1;i<=k;i++)
{
if(s-adbuc[i]>=0&&biti[i][s-adbuc[i]]==1)
{
for(j=(i-1)*k+1;j<=i*k;j++)
if(add[j]+adbuc[i]==s)return vect[j];
}
}
return -1;
}
int main()
{
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
scanf("%d%d",&n,&nrt);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1);
for(i=1;i*i<=nr;i++)
k=i;
k++;
for(i=nr+1;i<=k*k;i++)
vect[i]=-1000;
for(i=1;i<=k*k;i++)
{
bucata[i]=(i-1)/k+1;
}
for(i=1;i<=k;i++)
{
st[i]=k*(i-1)+1-k;
dr[i]=k*(i-1)+1+k;
}
for(i=1;i<=k;i++)
biti[i][0]=1;
for(i=1;i<=nrt;i++)
{
scanf("%d",&q);
if(q==1)
{
scanf("%d%d",&x,&y);
update(inc[x],fin[x],y);
}
else
{
scanf("%d",&x);
printf("%d\n",query(x));
}
}
return 0;
}