Pagini recente » Cod sursa (job #2272805) | Cod sursa (job #892206) | Cod sursa (job #146001) | Cod sursa (job #512949) | Cod sursa (job #445202)
Cod sursa(job #445202)
#include <stdio.h>
#include <vector>
#include <bitset>
#define pb push_back
#define NMAX 100005
#define LMAX 355
#define HMAX 1000005
using namespace std;
int n,m,nr,gr,B[NMAX],C[NMAX],st[NMAX],r;
int D[LMAX],E[NMAX];
vector <int> A[NMAX];
bitset <HMAX> marc[LMAX];
void read()
{
scanf("%d%d",&n,&m);
int i,x,y;
for (i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
A[x].pb(y);
}
}
int cbin(int val)
{
int i,step=1<<10;
for (i=0; step; step>>=1)
if ((i+step)*(i+step)<=n)
i+=step;
return i;
}
void dfs(int nod)
{
int i,vec;
st[++r]=nod;
B[nod]=r;
for (i=0; i<A[nod].size(); i++)
{
vec=A[nod][i];
dfs(vec);
}
C[nod]=r;
}
void update(int x,int y,int val)
{
int st1,st2;
if (x%nr==1)
st1=x/nr+1;
else
{
if (x%nr==0)
st1=x/nr+1;
else
st1=x/nr+2;
}
st2=y/nr;
int i;
for (i=st1; i<=st2; i++)
D[i]+=val;
if (st1<=st2)
{
for (i=(st1-2)*nr+1; i<=(st1-1)*nr; i++)
if (i>0)
marc[st1-1][E[i]]=0;
for (i=st2*nr+1; i<=(st2+1)*nr; i++)
if (st2+1<=gr)
marc[st2+1][E[i]]=0;
for (i=x; i<=(st1-1)*nr; i++)
E[i]+=val;
for (i=st2*nr+1; i<=y; i++)
E[i]+=val;
for (i=(st1-2)*nr+1; i<=(st1-1)*nr; i++)
if (i>0)
marc[st1-1][E[i]]=1;
for (i=st2*nr+1; i<=(st2+1)*nr; i++)
if (st2+1<=gr)
marc[st2+1][E[i]]=1;
}
else
{
if (y % nr==0)
{
for (i=(st2-1)*nr+1; i<=st2*nr; i++)
marc[st2][E[i]]=0;
for (i=x; i<=y; i++)
E[i]+=val;
for (i=(st2-1)*nr+1; i<=st2*nr; i++)
marc[st2][E[i]]=1;
}
else
{
for (i=st2*nr+1; i<=(st2+1)*nr; i++)
marc[st2+1][E[i]]=0;
for (i=x; i<=y; i++)
E[i]+=val;
for (i=st2*nr+1; i<=(st2+1)*nr; i++)
marc[st2+1][E[i]]=1;
}
}
}
int cauta(int x)
{
int i,j;
for (i=1; i<=gr; i++)
if (marc[i][x-D[i]])
{
for (j=(i-1)*nr+1; j<=i*nr; j++)
if (E[j]==x-D[i])
return st[j];
}
return -1;
}
void init()
{
int i;
for (i=1; i<=gr; i++)
marc[i][0]=1;
}
void querys()
{
int i,tip,x,y;
for (i=1; i<=m; i++)
{
scanf("%d",&tip);
if (tip==1)
{
scanf("%d%d",&x,&y);
update(B[x],C[x],y);
}
else
{
scanf("%d",&x);
printf("%d\n",cauta(x));
}
}
}
int main()
{
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
read();
nr=cbin(n);
gr=(n%nr==0) ? n/nr : n/nr+1;
dfs(1);
init();
querys();
return 0;
}