Pagini recente » Cod sursa (job #2369562) | Cod sursa (job #423708) | Cod sursa (job #2894105) | Cod sursa (job #1469156) | Cod sursa (job #2399442)
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>
#define N 100005
using namespace std;
int n,m,x,y,c;
vector <int> g[N];
bitset <N> viz;
int a[N], b[350], f[N], l[N], la, sqr, v[N], lb;
bitset <1000005> ap[350];
void dfs(int nod){
viz[nod] = 1;
f[nod] = la;
a[la++] = nod;
for(int i : g[nod])
if(!viz[i])
dfs(i);
l[nod]=la-1;
}
void actualizare(int buc){
ap[buc].reset();
for(int i = sqr*buc; i<= min((buc+1)*sqr - 1, la); ++i)
ap[buc][v[a[i]]] = 1;
}
void actualizare(int st, int dr, int val){
for(int i = st; i<= dr; ++i){
if(i%sqr == 0 && dr-i+1>=sqr){
b[i/sqr] += val;
i+=sqr - 1;
}
else
v[a[i]]+=val;
}
actualizare(st/sqr);
actualizare(dr/sqr);
}
int cauta(int buc, int val){
for(int i = sqr*buc; i<= min((buc+1)*sqr - 1, la); ++i)
if(v[a[i]]==val)
return a[i];
return -1;
}
int cauta(int val){
for(int i = 0; i <= lb; ++i)
if(ap[i][val-b[i]])
return cauta(i,val-b[i]);
return -1;
}
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);
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1);
sqr = sqrt(la);
lb=la/sqr;
if(la%sqr!=0)
++lb;
for(int i = 0; i < lb; ++i)
ap[i][0]=1;
for(int i = 0; i < m; ++i){
scanf("%d%d", &c,&x);
if(c==1){
scanf("%d", &y);
actualizare(f[x],l[x],y);
}else
cout<<cauta(x)<<"\n";
}
return 0;
}