Pagini recente » Cod sursa (job #1798273) | Cod sursa (job #1173210) | Cod sursa (job #2668060) | Monitorul de evaluare | Cod sursa (job #1329750)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <bitset>
#define NMAX 100000
#define RADMAX 405
using namespace std;
int n;
vector<int> graf[NMAX+5];
int poz;
int parc[NMAX+5];
int first[NMAX+5];
int last[NMAX+5];
void dfs (int nod, int father) {
parc[++poz]=nod;
first[nod]=poz;
for(vector<int>::iterator it=graf[nod].begin();it!=graf[nod].end();it++)
if(*it!=father)
dfs(*it,nod);
last[nod]=poz;
}
int rad;
int lazy[RADMAX];
int sir[NMAX+5];
bitset<1000005> _hashes[RADMAX];
inline void de_hash (int bucata) {
int aux=min(n,bucata*rad);
for(int i=(bucata-1)*rad+1;i<=aux;i++)
_hashes[bucata][sir[i]]=0;
}
inline void _hash (int bucata) {
int aux=min(n,bucata*rad);
for(int i=(bucata-1)*rad+1;i<=aux;i++)
_hashes[bucata][sir[i]]=1;
}
void update (int st, int dr, int val) {
int bst=(st-1)/rad+1;
int bdr=(dr-1)/rad+1;
if(bst==bdr) {
de_hash(bst);
for(int i=st;i<=dr;i++)
sir[i]+=val;
_hash(bst);
}
else {
for(int i=bst+1;i<bdr;i++)
lazy[i]+=val;
de_hash(bst);de_hash(bdr);
int bstrad=min(n,bst*rad);
for(int i=st;i<=bstrad;i++)
sir[i]+=val;
for(int i=(bdr-1)*rad+1;i<=dr;i++)
sir[i]+=val;
_hash(bst),_hash(bdr);
}
}
inline int query (int sum) {
int j,aux=(n-1)/rad+1;
for(int i=1;i<=aux;i++)
if(sum>=lazy[i] && _hashes[i][sum-lazy[i]])
for(j=(i-1)*rad+1,aux=min(i*rad,n),sum-=lazy[i];j<=aux;j++)
if(sir[j]==sum)
return parc[j];
return -1;
}
int main()
{
ifstream cin("arbore.in");
ofstream cout("arbore.out");
int m=0;
cin>>n>>m;
//rad=min((int)(1*sqrt(n)),n);
rad=sqrt(n);
int a,b;
for(int i=1;i<n;i++) {
cin>>a>>b;
graf[a].push_back(b);
graf[b].push_back(a);
}
dfs(1,0);
int aux=(n-1)/rad+1;
for(int i=1;i<=aux;i++)
_hashes[i][0]=1;
int tip,p,s;
while(m--) {
cin>>tip;
if(tip==1) {
cin>>p>>s;
update(first[p],last[p],s);
}
else {
cin>>s;
cout<<query(s)<<'\n';
}
}
cin.close();
cout.close();
return 0;
}