Pagini recente » Statistici Zidaru Ana-Maria (anamariazidaru) | Cod sursa (job #1333175) | Cod sursa (job #1750269) | Istoria paginii runda/oji2005_clasa_a_9_a/clasament | Cod sursa (job #1220170)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<bitset>
#include<math.h>
using namespace std;
#define NMAX 100001
#define RMAX 401
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,j,k;
nr=0;
R=sqrt(n);
i=1;
j=min(n,R);
while(i<=n) {
nr++;
l[nr]=i;
r[nr]=j;
for(k=i;k<=j;k++)
poz[k]=nr;
i=j+1;
j=min(n,j+R);
p[nr][0]=1;
}
l[nr+1]=r[nr+1]=n+1;
}
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];
}
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>=200);
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;
}