Pagini recente » Cod sursa (job #1362463) | Cod sursa (job #873927) | Cod sursa (job #646684) | Cod sursa (job #1114240) | Cod sursa (job #993188)
Cod sursa(job #993188)
#include<fstream>
#include<cstdio>
#include<bitset>
#include<vector>
#include<cmath>
#include<cstring>
#define NMAX 100002
#define SQRT 320
using namespace std;
ifstream fin("arbore.in");
FILE *fout;
vector<int> G[NMAX];
int n,m,lin[NMAX],first[NMAX],last[NMAX],k,node_val[NMAX];
struct piece
{
bitset<1000001> val;
int left,right,common;
}v[SQRT];
//
const int SZ=10000;
char input[SZ+1],*in;
int atoi()
{
int nr =0;
for(;!(*in>='0' && *in<='9') && *in;in++);
if(!*in)
{
memset(input,0,sizeof input);
fin.read(input,SZ);
in=input;
for(;!(*in>='0' && *in<='9') && *in;in++);
}
for(;*in>='0' && *in<='9';in++)
{
nr=nr*10+(*in-'0');
if(!*(in+1))
{
memset(input,0,sizeof input);
fin.read(input,SZ);
in=input-1;
}
}
return nr;
}
//
void read()
{
fin.read(input,SZ);
in=input;
n=atoi();
m=atoi();
for(int i=1,x,y;i<n;i++)
{
x=atoi();
y=atoi();
G[x].push_back(y);
G[y].push_back(x);
}
}
inline void DFS(int nod,int TT)
{
lin[++k]=nod;
first[nod]=k;
for(size_t i=0;i<G[nod].size();i++)
if(G[nod][i]!=TT)
DFS(G[nod][i],nod);
last[nod]=k;
}
void split()
{
k=0;
for(int i=1,L=(int)sqrtl(n);i<=n;i+=L)
{
v[++k].left=i;
v[k].right=min(i+L-1,n);
v[k].val[0]=1;
}
}
void update(int left,int right,int add)
{
for(int i=1;i<=k;i++)
{
if(v[i].left>right)
break;
if(v[i].right<left)
continue;
if(left<=v[i].left && v[i].right<=right)
{
v[i].common+=add;
continue;
}
for(int j=v[i].left;j<=v[i].right;j++)
{
v[i].val[node_val[j]]=0;
node_val[j]+=v[i].common;
if(left<=j && right>=j)
node_val[j]+=add;
}
for(int j=v[i].left;j<=v[i].right;j++)
v[i].val[node_val[j]]=1;
v[i].common=0;
}
}
int query(int sum)
{
for(int i=1;i<=k;i++)
if(v[i].common<=sum && v[i].val[sum-v[i].common])
for(int j=v[i].left;j<=v[i].right;j++)
if(sum-v[i].common==node_val[j])
return lin[j];
return -1;
}
void solve()
{
fout=fopen("arbore.out","w");
DFS(1,0);
split();
for(int a,b,c;m;m--)
{
a=atoi();
b=atoi();
if(a==1)
{
c=atoi();
update(first[b],last[b],c);
continue;
}
fprintf(fout,"%d\n",query(b));
}
}
int main()
{
read();
solve();
return 0;
}