Pagini recente » Cod sursa (job #2775626) | Cod sursa (job #2195872) | Cod sursa (job #2168202) | Cod sursa (job #473730) | Cod sursa (job #1448058)
#include <cstdio>
#include <bitset>
#include <vector>
#include <cmath>
using namespace std;
struct strbucket
{
int st,dr,s;
bitset<1000010> vaz;
}v1[320];
vector<int> v[100010];
int val[100010],q[100010],first[100010],last[100010],nr,rad;
char vaz[100010];
int bucket(int x)
{
return (x-1)/rad+1;
}
void dfs(int nod)
{
vaz[nod]=1;
q[++nr]=nod;
first[nod]=nr;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
if(!vaz[*it]) dfs(*it);
last[nod]=nr;
}
void update(int buc,int st,int dr,int s)
{
for(int i=v1[buc].st;i<=v1[buc].dr;i++) v1[buc].vaz[val[i]]=0;
for(int i=st;i<=dr;i++) val[i]+=s;
for(int i=v1[buc].st;i<=v1[buc].dr;i++) v1[buc].vaz[val[i]]=1;
}
int main()
{
freopen("arbore.in", "r", stdin);
freopen("arbore.out", "w", stdout);
int n,m,tip,x,y,nrbuc,nod,s;
scanf("%d%d",&n,&m);
rad=sqrt(n)+1;
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1);
for(int i=1;rad*(i-1)<nr;i++)
{
v1[i].st=rad*(i-1)+1;
v1[i].dr=min(nr,rad*i);
v1[i].vaz[0]=1;
nrbuc=i;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&tip);
if(tip==1)
{
scanf("%d%d",&nod,&s);
int lim=bucket(last[nod]);
for(int j=bucket(first[nod]);j<=lim;j++)
if(first[nod]<=v1[j].st && v1[j].dr<=last[nod]) v1[j].s+=s;
else update(j,max(first[nod],v1[j].st),min(last[nod],v1[j].dr),s);
}
else
{
int sol=-1,s;
scanf("%d",&s);
for(int j=1;j<=nrbuc;j++)
if(s-v1[j].s>=0 && v1[j].vaz[s-v1[j].s]==1)
{
for(int q=v1[j].st;q<=v1[j].dr;q++) if(val[q]==s-v1[j].s) {sol=q;break;}
break;
}
printf("%d\n",sol);
}
}
return 0;
}