Pagini recente » Cod sursa (job #977737) | Cod sursa (job #15962) | Cod sursa (job #2217108) | Cod sursa (job #613704) | Cod sursa (job #1966753)
#include <bits/stdc++.h>
#define pb push_back
#define Nmax 100005
#define SQRT 330
using namespace std;
vector <int> L[Nmax];
int order[Nmax],pos[Nmax],l,nrfii[Nmax],val[Nmax],n;
int st[SQRT],dr[SQRT],nr_buc,sum[SQRT],Sqrt,wh[Nmax];
bitset <1000005> fr[SQRT];
void dfs(int nod, int tata)
{
order[++l]=nod; pos[nod]=l;
for(auto it : L[nod])
if(it!=tata)
{
dfs(it,nod);
nrfii[nod]+=nrfii[it]+1;
}
}
inline void decompose()
{
int i,j;
Sqrt=sqrt(1.0*n);
for(i=1;i<=n;i+=Sqrt)
{
fr[++nr_buc][0]=1;
st[nr_buc]=i; dr[nr_buc]=min(i+Sqrt-1,n);
for(j=st[nr_buc];j<=dr[nr_buc];++j)
wh[j]=nr_buc;
}
}
inline void Mark(int buc, int b)
{
for(int i=st[buc];i<=dr[buc];++i)
fr[buc][val[i]]=b;
}
inline void upd(int Lft, int Rgt, int x)
{
int i,b1=0,b2;
for(i=1;i<=nr_buc && dr[i]<=Rgt;++i)
if(st[i]>=Lft)
{
sum[i]+=x;
if(!b1) b1=i;
b2=i;
}
if(!b1)
{
Mark(wh[Lft],0);
if(wh[Rgt]!=wh[Lft]) Mark(wh[Rgt],0);
for(i=Lft;i<=Rgt;++i) val[i]+=x;
Mark(wh[Lft],1);
if(wh[Rgt]!=wh[Lft]) Mark(wh[Rgt],1);
}
if(b1>1 && dr[b1-1]>=Lft)
{
Mark(b1-1,0);
for(i=Lft;i<st[b1];++i) val[i]+=x;
Mark(b1-1,1);
}
if(b2<nr_buc && st[b2+1]<=Rgt)
{
Mark(b2+1,0);
for(i=st[b2+1];i<=Rgt;++i) val[i]+=x;
Mark(b2+1,1);
}
}
inline int qry(int S)
{
int i,j;
/*for(i=1;i<=nr_buc;++i)
if(sum[i]<=S && fr[i][S-sum[i]])
for(j=st[i];j<=dr[i];++j)
if(val[j]==S-sum[i])
return order[j];*/
for(i=1;i<=n;++i)
if(sum[wh[i]]+val[i]==S) return order[i];
return -1;
}
int main()
{
int m,x,y,i,tip;
ifstream cin("arbore.in");
ofstream cout("arbore.out");
cin>>n>>m;
for(i=1;i<n;++i)
{
cin>>x>>y;
L[x].pb(y); L[y].pb(x);
}
dfs(1,0);
decompose();
while(m--)
{
cin>>tip>>x;
if(tip==1)
{
cin>>y;
upd(pos[x],pos[x]+nrfii[x],y);
}
else
cout<<qry(x)<<"\n";
}
return 0;
}