Pagini recente » Cod sursa (job #3205589) | Cod sursa (job #2648693) | Cod sursa (job #3255589) | Cod sursa (job #2017000) | Cod sursa (job #2009951)
#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
const int rp=350;
multiset<int> Set[rp];
int vect[maxN],dv;
bool seen[maxN];
vector<int> v[maxN];
int depth[maxN];
inline void dfs(int nod)
{
vect[++dv]=nod;
seen[nod]=1;
for(auto it:v[nod])
{
if(!seen[it])
{
depth[it]=1+depth[nod];
dfs(it);
}
}
}
int val[maxN],n,m,x,y,nbucket;
inline void Search(int bucket,int y)
{
int start,finish;
start=rp*(bucket-1)+1;
finish=rp*bucket;
for(int i=start;i<=finish;i++)
if(val[i]==y)
{
printf("%d\n",i);
return ;
}
}
int add[rp],pos[maxN],vf,st[maxN],op,p,dr[maxN],bucket,vl;
int main()
{
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
nbucket=n/rp;
if(n%rp) nbucket++;
dfs(1);
for(int i=1;i<=dv;i++)
{
pos[vect[i]]=i;
if(vf && depth[vect[st[vf]]]==depth[i])
{
dr[vect[st[vf]]]=i-1;
vf--;
}
st[++vf]=i;
}
while(vf)
{
dr[vect[st[vf]]]=n;
vf--;
}
for(int i=1;i<=n;i++)
{
bucket=i/rp;
if(i%rp) bucket++;
Set[bucket].insert(0);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&x,&y);
p=pos[x];
int xbucket=p/rp;
if(p%rp) xbucket++;
int ybucket=dr[x]/rp;
if(dr[x]%rp) ybucket++;
for(int bucket=xbucket+1;bucket<ybucket;bucket++)
{
add[bucket]+=y;
}
if(xbucket==ybucket)
{
for(int j=p;j<=dr[x];j++)
{
multiset<int>::iterator it=Set[xbucket].lower_bound(val[j]);
Set[xbucket].erase(it);
Set[xbucket].insert(val[j]+y);
val[j]+=y;
}
continue;
}
for(int j=p;j<=rp*xbucket;j++)
{
multiset<int>::iterator it=Set[xbucket].lower_bound(val[j]);
Set[xbucket].erase(it);
Set[xbucket].insert(val[j]+y);
val[j]+=y;
}
for(int j=rp*(ybucket-1)+1;j<=dr[x];j++)
{
multiset<int>::iterator it=Set[ybucket].lower_bound(val[j]);
Set[ybucket].erase(it);
Set[ybucket].insert(val[j]+y);
val[j]+=y;
}
}
else
if(op==2)
{
scanf("%d",&vl);
for(int i=1;i<=nbucket;i++)
{
int y=vl-add[i];
multiset<int>::iterator it=Set[i].lower_bound(y);
if(it!=Set[i].end() && *it==y)
{
Search(i,y);
break;
}
}
}
}
return 0;
}