Pagini recente » Cod sursa (job #650578) | Cod sursa (job #479661) | Clasamentul arhivei de probleme | Clasamentul arhivei de probleme | Cod sursa (job #480316)
Cod sursa(job #480316)
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
const char iname[]="arbore.in";
const char oname[]="arbore.out";
const int maxn=100005;
const int maxs=1000005;
const int maxq=320;
ifstream f(iname);
ofstream g(oname);
int start[maxn],finish[maxn],a[maxn],who[maxn],r,k,bonus[maxq],n,m,i,x,y;
vector<int> E[maxn];
bitset<maxs> pos[maxq];
void dfs(int x)
{
if(start[x])
return;
start[x]=++r;
a[r]=0;who[r]=x;
for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
dfs(*it);
finish[x]=r;
}
int query(int x)
{
for(int i=1;i<=k;++i)
if(bonus[i]<=x&&pos[i][x-bonus[i]]==1)
{
for(int j=maxq*(i-1)+1;j<=maxq*i;++j)
if(a[j]==x-bonus[i])
return who[j];
}
return -1;
}
void update(int group,int start,int finish,int v)
{
for(int i=start;i<=finish;++i)
pos[group][a[i]]=0,a[i]+=v;
for(int i=(group-1)*maxq+1;i<=group*maxq&&i<=n;++i)
pos[group][a[i]]=1;
}
void update(int start,int finish,int v)
{
int groups=(start-1)/maxq+1,groupf=(finish-1)/maxq+1;
if(groups!=groupf)
{
update(groups,start,groups*maxq,v);
update(groupf,(groupf-1)*maxq+1,finish,v);
for(int i=groups+1;i<groupf;++i)
bonus[i]+=v;
return;
}
update(groups,start,finish,v);
}
int main()
{
f>>n>>m;
for(i=1;i<n;++i)
f>>x>>y,E[x].push_back(y),E[y].push_back(x);
dfs(1);
k=(n-1)/maxq+1;
for(i=1;i<=k;++i)
pos[i][0]=1;
while(m--)
{
f>>x;
if(x==1)
{
f>>x>>y;
update(start[x],finish[x],y);
continue;
}
f>>y;
g<<query(y)<<"\n";
}
}