Pagini recente » Rating Purice Ciprian (gorgoroth) | Cod sursa (job #498900) | Cod sursa (job #1407549) | Cod sursa (job #1356570) | Cod sursa (job #2021652)
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
const int rp=350;
bitset<10*maxN> ap[rp+5];
vector<int> v[maxN];
int e[maxN],AD[rp+5];
bool seen[maxN];
int niv[maxN],h[maxN],dh,st[maxN],dr[maxN],vf,s[maxN];
inline void dfs(int nod)
{
seen[nod]=1;
h[++dh]=nod;
st[nod]=dh;
for(auto it:v[nod])
{
if(seen[it]) continue;
niv[it]=1+niv[nod];
dfs(it);
}
}
inline void Build()
{
for(int i=1;i<=dh;i++)
{
while(vf && niv[h[s[vf]]]>=niv[h[i]])
{
dr[h[s[vf]]]=i-1;
vf--;
}
s[++vf]=i;
}
while(vf)
{
dr[h[s[vf]]]=dh;
vf--;
}
}
int op;
inline void Update(int nod,int val)
{
int x,y,xbucket,ybucket;
x=st[nod];
y=dr[nod];
xbucket=x/rp;
if(x%rp) xbucket++;
ybucket=y/rp;
if(y%rp) ybucket++;
if(xbucket<ybucket)
{
for(int bucket=xbucket+1;bucket<ybucket;bucket++)
AD[bucket]+=val;
for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
ap[xbucket][e[i]]=0;
for(int i=x;i<=xbucket*rp;i++)
e[i]+=val;
for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
ap[xbucket][e[i]]=1;
for(int i=(ybucket-1)*rp+1;i<=ybucket*rp;i++)
ap[ybucket][e[i]]=0;
for(int i=(ybucket-1)*rp+1;i<=y;i++)
e[i]+=val;
for(int i=(ybucket-1)*rp+1;i<=ybucket*rp;i++)
ap[ybucket][e[i]]=1;
}
else
{
for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
ap[xbucket][e[i]]=0;
for(int i=x;i<=y;i++)
e[i]+=val;
for(int i=(xbucket-1)*rp+1;i<=xbucket*rp;i++)
ap[xbucket][e[i]]=1;
}
}
inline void Search(int bucket,int val)
{
for(int i=(bucket-1)*rp+1;i<=bucket*rp;i++)
if(e[i]==val)
{
printf("%d\n",h[i]);
return;
}
}
inline void Query(int val)
{
for(int i=1;i<=rp;i++)
if(val>=AD[i] && ap[i][val-AD[i]])
{
Search(i,val-AD[i]);
return;
}
printf("-1\n");
}
int n,q,x,y,p,add;
int main()
{
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
niv[1]=1;
dfs(1);
Build();
for(int i=1;i<=q;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&p,&add);
Update(p,add);
}
else
{
scanf("%d",&x);
Query(x);
}
}
return 0;
}