Pagini recente » Cod sursa (job #721918) | Cod sursa (job #1763730) | Cod sursa (job #2497791) | Cod sursa (job #2650417) | Cod sursa (job #1591326)
#include <cstdio>
#define sz 330
#define N 100005
#include <vector>
#include <bitset>
using namespace std;
int nr=0,i,q,n,op,x,y,Begin[N],End[N],a[N],ind[N],add[N],s,p;
vector<int> v[N];
bitset<N> bts[sz+2];
bool marked[N];
inline void DFS(int x)
{
marked[x]=1;
Begin[x]= ++nr;
ind[nr]=x;
int i;
for(i=0;i<v[x].size();++i)
if(!marked[v[x][i]])
DFS(v[x][i]);
End[x]=nr;
}
inline void UPDATE(int x,int y,int s)
{
int i,bloc;
bloc=x/sz+1;
bts[bloc]=0;
for(i=x;i<=bloc*sz && i<=y;++i) a[i]+=s;
for(i=(bloc-1)*sz+1;i<=bloc*sz;++i) bts[bloc][a[i]]=1;
if(bloc==y/sz+1) return;
++bloc;
if(bloc+1!=y/sz+1) for(;bloc*sz<=y;++bloc) add[bloc]+=s;
bts[bloc]=0;
for(i=(bloc-1)*sz+1;i<=y;++i) a[i]+=s;
for(i=(bloc-1)*sz+1;i<=bloc*sz;++i) bts[bloc][a[i]]=1;
}
inline void QUERY(int s)
{
int bloc,i;
for(bloc=1;bloc*sz<=n;++bloc)
if(s>=add[bloc] && bts[bloc][s-add[bloc]])
{
for(i=(bloc-1)*sz+1;i<=bloc*sz;++i)
if(a[i]+add[bloc]==s)
{
printf("%d\n",ind[i]);
return;
}
}
for(i=(bloc-1)*sz+1;i<=n;++i)
if(a[i]+add[bloc]==s)
{
printf("%d\n",ind[i]);
return;
}
printf("-1\n");
}
int main()
{
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
scanf("%d%d",&n,&q);
for(i=1;i<n;++i)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
DFS(1);
while(q--)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&p,&s);
UPDATE(Begin[p],End[p],s);
}
else
{
scanf("%d",&s);
QUERY(s);
}
}
return 0;
}