Cod sursa(job #1869657)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 6 februarie 2017 01:20:02
Problema Arbore Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 3.13 kb
#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;
}