Pagini recente » Cod sursa (job #61688) | Cod sursa (job #284260) | Cod sursa (job #1172315) | Cod sursa (job #1168565) | Cod sursa (job #788649)
Cod sursa(job #788649)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define DN 100005
#define SQ 450
#define DV 200005
using namespace std;
typedef vector<int>::iterator it;
int n,m,eu[DN*2],f[DN],l[DN],v[DN*2],buc[SQ],sz;
bitset<DV> am[SQ];
vector<int> gr[DN];
void dfs(int s, int fa) {
eu[++sz]=s;
f[s]=sz;
for(it i=gr[s].begin();i!=gr[s].end(); ++i) if(*i!=fa) dfs(*i,s);
eu[++sz]=s;
l[s]=sz;
}
void update(int nod,int suma) {
for(int a=1,b=SQ,ib=0; a<=sz;a=b+1,b+=SQ,++ib) {
if(f[nod]>b || l[nod]<a) continue;
if(f[nod]<=a && l[nod]>=b) {
buc[ib]+=suma;
continue;
}
int lim=min(b,sz);
for(int i=a; i<=lim; ++i) am[ib][v[i]]=0;
lim=min(l[nod],b);
for(int i=max(a,f[nod]);i<=lim; ++i) v[i]+=suma;
lim=min(b,sz);
for(int i=a; i<=lim; ++i) am[ib][v[i]]=1;
}
}
int cauta(int a,int b, int vl) {
for(int i=a; i<=b; ++i) if(v[i]==vl) return eu[i];
return -1;
}
int query(int suma) {
for(int a=1,b=SQ,ib=0; a<=sz;a=b+1,b+=SQ,++ib) {
int vl=suma-buc[ib];
if(vl>=0 && am[ib][vl]) return cauta(a,min(b,sz),vl);
}
return -1;
}
int main()
{
ifstream f("arbore.in");
ofstream g("arbore.out");
f>>n>>m;
for(int i=1; i<n; ++i) {
int a,b;
f>>a>>b;
gr[a].push_back(b);
gr[b].push_back(a);
}
dfs(1,0);
for(int i=0; i<m; ++i) {
int op,a,b;
f>>op;
if(op==1) {
f>>a>>b;
update(a,b);
}else {
f>>a;
g<<query(a)<<'\n';
}
}
return 0;
}