Pagini recente » Romanian Master in Mathematics and Sciences 2011, Clasament | Cod sursa (job #2000716) | Istoria paginii runda/hlo_cj_av_dintrie | Cod sursa (job #2072366) | Cod sursa (job #1220179)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<bitset>
#include<math.h>
using namespace std;
#define NMAX 100010
#define RMAX 325
vector <int> v[NMAX];
int st[NMAX],dr[NMAX],viz[NMAX],a[NMAX],c[RMAX],l[RMAX],r[RMAX],b[NMAX],poz[NMAX],nr;
bitset <RMAX> p[1000001];
void dfs(int nod)
{
viz[nod]=1;
nr++;
st[nod]=nr;
b[nr]=nod;
for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
if(viz[*it]==0)
dfs(*it);
dr[nod]=nr;
}
void buildsqrt(int n)
{
int i,R;
nr=0;
R=sqrt(n);
for(i=1;i<=n;i++) {
if(i%R==1) {
nr++;
l[nr]=i;
r[nr-1]=i-1;
p[nr][0]=1;
}
poz[i]=nr;
}
r[nr]=n;
}
void interval(int poz1, int poz2, int sum)
{
int k,i;
k=poz[poz1];
for(i=l[k];i<=r[k];i++)
p[k][a[i]]=0;
for(i=poz1;i<=poz2;i++)
a[i]=a[i]+sum;
for(i=l[k];i<=r[k];i++)
p[k][a[i]]=1;
}
void update(int poz1, int poz2, int sum)
{
int k;
if(poz[poz1]==poz[poz2]) {
interval(poz1,poz2,sum);
return ;
}
update(poz1,r[poz[poz1]],sum);
for(k=poz[poz1]+1;k<=poz[poz2]-1;k++)
c[k]=c[k]+sum;
update(l[poz[poz2]],poz2,sum);
}
int query(int val)
{
int k,i;
for(k=1;k<=nr;k++)
if(c[k]<=val && p[k][val-c[k]]==1) {
for(i=l[k];i<=r[k];i++)
if(c[k]+a[i]==val)
return b[i];
while(1);
}
return -1;
}
int main ()
{
int n,x,y,m,op,i;
ifstream f("arbore.in");
ofstream g("arbore.out");
f>>n>>m;
for(i=1;i<=n-1;i++) {
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1);
buildsqrt(n);
while(nr>=325);
for(i=1;i<=m;i++) {
f>>op;
if(op==1) {
f>>x>>y;
update(st[x],dr[x],y);
}
else {
f>>x;
g<<query(x)<<'\n';
}
}
f.close();
g.close();
return 0;
}