Pagini recente » Cod sursa (job #2113261) | Cod sursa (job #2282079) | Cod sursa (job #2487072) | Monitorul de evaluare | Cod sursa (job #2002244)
#include <bits/stdc++.h>
#define NMAX 1000005
#define XMAX 100005
using namespace std;
int nr,k,add[NMAX],abuc[NMAX];
int buc[XMAX],ap[XMAX],vect[XMAX];
int inc[XMAX],fin[XMAX],stv[XMAX],drv[XMAX];
bitset<NMAX> b[320];
vector<int> v[XMAX];
ifstream si("arbore.in");
ofstream so("arbore.out");
void dfs(int nod)
{
ap[nod]=1;
nr++;
vect[nr]=nod;
inc[nod]=nr;
for(int i=0;i<v[nod].size();i++)
if(ap[v[nod][i]]==0)dfs(v[nod][i]);
fin[nod]=nr;
}
void ubuc(int buc,int val)
{
for(int i=stv[buc];i<=drv[buc];i++)
b[buc][add[i]]=val;
}
void upd(int st,int dr,int val)
{
if(buc[st]==buc[dr])
{
ubuc(buc[st],0);
for(int i=st;i<=dr;i++)
add[i]+=val;
ubuc(buc[st],1);
}
else
{
ubuc(buc[st],0);
ubuc(buc[dr],0);
for(int i=st;i<=drv[buc[st]];i++)
add[i]+=val;
for(int i=stv[buc[dr]];i<=dr;i++)
add[i]+=val;
ubuc(buc[st],1);
ubuc(buc[dr],1);
for(int i=buc[st]+1;i<=buc[dr]-1;i++)
abuc[i]+=val;
}
}
int query(int s)
{
int i,j;
for(int i=1;i<=k;i++)
{
if(s-abuc[i]>=0&&b[i][s-abuc[i]]==1)
{
for(int j=stv[i];j<=drv[i];j++)
if(add[j]+abuc[i]==s)return vect[j];
}
}
return -1;
}
int main()
{
int n,m;
si>>n>>m;
int x,y;
for(int i=1;i<n;i++)
{
si>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1);
for(int i=1;i*i<=n;i++)
k=i;
nr=0;
for(int i=1;(i-1)*k+1<=n;i++)
{
nr++;
stv[i]=(i-1)*k+1;
for(int j=stv[i];j<=stv[i]+k-1&&j<=n;j++)
{
drv[i]=j;
buc[j]=i;
}
}
stv[0]=0;
k=nr;
for(int i=1;i<=k;i++)
b[i][0]=1;
int q;
for(int i=1;i<=m;i++)
{
si>>q;
if(q==1)
{
si>>x>>y;
upd(inc[x],fin[x],y);
}
else
{
si>>x;
so<<query(x)<<'\n';
}
}
return 0;
}