Pagini recente » Cod sursa (job #1212353) | Cod sursa (job #1781313) | Cod sursa (job #2645385) | Cod sursa (job #1869657)
#include <fstream>
#include <bitset>
#include <cmath>
#include <vector>
#define NMAX 100005
using namespace std;
ifstream f("arbore.in");
ofstream g("arbore.out");
int Array[NMAX],Seq[400],Val[NMAX],Poz2[NMAX];
int Aux[NMAX];
int Poz[NMAX];
int poz,N,M;
bitset <NMAX*10> Exist[400];
vector <int> G[NMAX];
bool Use[NMAX];
void DFS(int node)
{
Use[node]=1;
++poz;
Poz[node]=poz;
Val[poz]=node;
for(int i=0;i<G[node].size();i++)
{
int neighbour=G[node][i];
if(Use[neighbour]==0)
DFS(neighbour);
}
Poz2[node]=poz;
}
void Read()
{
int i;
f>>N>>M;
for(int i=1;i<=N-1;i++)
{
int x,y;
f>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
}
void Update(int x,int y,int s)
{
int i,length=(int)sqrt((double)N)+1,seq=1;
for(i=1;seq<=length;i+=length,seq++)
{
if(i>y)
break;
if(i+length-1<x)
continue;
bool out=0;
if(i+length-1>N)
{
length=N+1-i;
out=1;
}
if((i+length-1>=x && i<=x))
{
Aux[0]=0;
for(int j=i;j<=i+length-1;j++)
{
Exist[seq][Array[j]]=0;
if(j>=x && j<=y)
Array[j]+=Seq[seq]+s;
else
Array[j]+=Seq[seq];
Aux[++Aux[0]]=Array[j];
}
Seq[seq]=0;
for(int k=1;k<=Aux[0];k++)
Exist[seq][Aux[k]]=1;
continue;
}
if(i+length-1>=y && i<=y)
{
Aux[0]=0;
for(int j=i;j<=i+length-1;j++)
{
Exist[seq][Array[j]]=0;
if(j<=y && j>=x)
Array[j]+=Seq[seq]+s;
else
Array[j]+=Seq[seq];
Aux[++Aux[0]]=Array[j];
}
for(int k=1;k<=Aux[0];k++)
Exist[seq][Aux[k]]=1;
Seq[seq]=0;
continue;
}
if(i>x && i+length-1<y)
Seq[seq]+=s;
if(out==1)
break;
}
}
void Query(int s)
{
int i,start=1;
int length=(int)sqrt((double)N)+1;
for(i=1;i<=length;i++,start+=length)
{
bool out=0;
if(i+length-1>N)
{
length=N+1-i;
out=1;
}
if(s>=Seq[i] && Exist[i][s-Seq[i]]==1)
{
for(int j=start;j<=start+length-1;j++)
if(s-Seq[i]==Array[j])
{
g<<Val[j]<<"\n";
return;
}
}
if(out==1)
break;
}
g<<-1<<"\n";
}
int main()
{
Read();
DFS(1);
for(int i=1;i*i<=N;i++)
Exist[i][0]=1;
for(int i=1;i<=M;i++)
{
int type,x,s;
f>>type;
if(type==1)
{
f>>x>>s;
Update(Poz[x],Poz2[x],s);
}
else
{
f>>s;
Query(s);
}
}
return 0;
}