Pagini recente » Cod sursa (job #460639) | Atasamentele paginii Profil arina.popianu | Cod sursa (job #681949) | Cod sursa (job #1008469) | Cod sursa (job #1749980)
#include <iostream>
#include<fstream>
#include<cmath>
#include<vector>
#include<bitset>
#include<string>
using namespace std;
const int nmax=100005;
vector< pair<int,int> >h[10*nmax];
vector<int> v[nmax];
bitset<nmax> viz;
struct smen
{
int l,r,add;
}a[405];
int rep[nmax],st[nmax],dr[nmax],buc[nmax],val[nmax];
int ind,idx,i,n,m,k,bucata,x,y,nr,stanga,dreapta,value,indice,tip,indi,num,c;
string str;
inline void dfs(int x)
{
viz[x]=1;
k++;
rep[k]=x;
st[x]=k;
for(int i=0;i<v[x].size();i++)
{
if(!viz[v[x][i]])
dfs(v[x][i]);
}
dr[x]=k;
}
inline void ins(int x,int b,int frecv)
{
for(int ind=0;ind<h[x].size();ind++)
{
if(h[x][ind].first==b)
{
h[x][ind].second+=frecv;
return;
}
}
h[x].push_back(make_pair(b,frecv));
}
inline void del(int x,int b)
{
for(int ind=0;ind<h[x].size();ind++)
{
if(h[x][ind].first==b)
{
h[x][ind].second--;
if(h[x][ind].second==0)
{
h[x][ind]=h[x].back();
h[x].pop_back();
}
return;
}
}
}
inline bool finds()
{
for(int ind=0;ind<h[nr].size();ind++)
if(h[nr][ind].first==idx) return true;
return false;
}
inline void make_pieces()
{
bucata=floor(sqrt(n));
for(i=1;i<=n;i++)
{
buc[i]=i/bucata+1;
if(a[buc[i]].l==0) a[buc[i]].l=i;
a[buc[i]].r=i;
}
for(i=1;i<=buc[n];i++)
{
ins(0,i,a[i].r-a[i].l+1);
}
}
inline void update()
{
for(indi=stanga;indi<=dreapta;indi++)
{
if(a[buc[indi]].l>=stanga&&a[buc[indi]].r<=dreapta)
{
a[buc[indi]].add+=value;
indi=a[buc[indi]].r;
continue;
}
del(val[indi],buc[indi]);
val[indi]+=value;
ins(val[indi],buc[indi],1);
}
}
inline int query()
{
for(idx=1;idx<=buc[n];idx++)
{
nr=x-a[idx].add;
if(nr>=0)
if(finds())
{
for(indice=a[idx].l;indice<=a[idx].r;indice++)
{
if(val[indice]==nr)
return rep[indice];
}
}
}
return -1;
}
inline int getnum()
{
num=0;
while(str[c]>='0'&&str[c]<='9')
{
num=num*10+str[c]-'0';
c++;
}
c++;
return num;
}
int main()
{
ifstream f("arbore.in");
ofstream g("arbore.out");
getline(f,str);
n=getnum();m=getnum();
for(i=1;i<=n-1;i++)
{
getline(f,str);
c=0;
x=getnum();y=getnum();
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1);
make_pieces();
for(i=1;i<=m;i++)
{
getline(f,str);
c=0;
tip=getnum();
if(tip==1)
{
x=getnum();
value=getnum();
stanga=st[x];
dreapta=dr[x];
update();
}
else
{
x=getnum();
g<<query()<<'\n';
}
}
return 0;
}