Pagini recente » Cod sursa (job #1802726) | Cod sursa (job #2036800) | Cod sursa (job #90160) | Cod sursa (job #3211496) | Cod sursa (job #3191607)
#include <bits/stdc++.h>
#define SIZE 100005
using namespace std;
ifstream f("arbore.in");
ofstream g("arbore.out");
int n,m,k,l,v[SIZE],sz[SIZE],poz[SIZE],add[SIZE],vv[SIZE];
vector<int>a[SIZE];
bitset<SIZE>fv[320];
void dfs(int nod,int tata)
{
v[++k]=nod;
sz[nod]=1;
poz[nod]=k;
for(auto u:a[nod])
if(u!=tata)
{
dfs(u,nod);
sz[nod]+=sz[u];
}
}
void update(int x,int y)
{
int i,st=(x-1)/l+1,dr=(x+sz[x]-2)/l+1;
for(i=st+1;i<=dr-1;i++)
add[i]+=y;
if(st==dr)
{
for(i=x;i<=x+sz[x]-1;i++)
{
vv[v[i]]+=y;
fv[st][vv[v[i]]]=1;
}
}
else
{
for(i=x;i<=st*l;i++)
{
vv[v[i]]+=y;
fv[st][vv[v[i]]]=1;
}
for(i=(dr-1)*l+1;i<=x+sz[x]-1;i++)
{
vv[v[i]]+=y;
fv[dr][vv[v[i]]]=1;
}
}
}
int query(int x)
{
int i,j;
for(i=1;i<=n/l;i++)
if(x>=add[i] && fv[i][x-add[i]])
{
for(j=(i-1)*l+1;j<=i*l;j++)
if(vv[v[j]]+add[i]==x)return v[j];
}
for(i=n-(n%l)+1;i<=n;i++)
if(vv[v[i]]==x)return v[i];
return -1;
}
int main()
{
int i,p,q,x,y,c,s;
f>>n>>m;
for(i=1;i<n;i++)
{
f>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
//Liniarizam arborele
dfs(1,0);
l=sqrtl(n);
for(i=1;i<=n/l;i++)
fv[i][0]=1;
for(i=1;i<=m;i++)
{
f>>c;
if(c==1)
{
f>>p>>q;
update(p,q);
}
else
{
f>>s;
g<<query(s)<<'\n';
}
}
return 0;
}