Cod sursa(job #951558)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 20 mai 2013 22:29:50
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.12 kb
//Sursa neterminata,plina de greseli caci m-am oprit la mijlocul scrierii ei din motive obiective
#include <iostream>

using namespace std;

struct nod
{
   int st,dr;
   int pref,suf,best;
   bool lenes;
   int val_lenes;
   
   nod()
   {  
      st=0;
      dr=0;
      pref=0;
      suf=0;
      best=0;
      lenes=0;     
      val_lenes=0;
   }    
}arb[262144],aux;
bool v[100005];

void build(int st,int dr,int poz)
{
   arb[poz].st=st;
   arb[poz].dr=dr;
   arb[poz].suf=arb[poz].pref=arb[poz].best=dr-st+1;
   arb[poz].lenes=0;
   arb[poz].val_lenes=0;
   
   if(dr>st)
   {
      int mijl=(st+dr)>>1;      
      build(st,mijl,poz<<1);
      build(mijl+1,dr,(poz<<1)+1);         
   }     
}

int maxim(int a,int b)
{
   if(a>b)
     return a;
   return b;   
}

int maxim(int a,int b,int c)
{
   return maxim(maxim(a,b),c);    
}

void recompute(nod &a,nod b,nod c)
{
   if((b.dr-b.st+1)==b.best)
     a.pref=b.best+c.pref;
   else
     a.pref=b.pref;
   if((c.dr-c.st+1)==c.best)
     a.suf=c.best+b.suf;
   else
     a.pref=c.suf;
   a.best=maxim(b.best,c.best,b.suf+c.pref);  
}

void update_1(int st,int dr,int poz);

void update_0(int st,int dr,int poz)
{     
   if(arb[poz].lenes)
   {   
      arb[poz<<1].lenes=1;
      arb[(poz<<1)+1].lenes=1;
      arb[poz<<1].val_lenes=arb[poz].val_lenes;
      arb[(poz<<1)+1].val_lenes=arb[poz].val_lenes;
      arb[poz].lenes=0;                  
   }
   
   if((arb[poz].dr<st) || (arb[poz].st>dr))
     return;
     
   if(st==dr)
   {
       v[st]=0;
       arb[poz].pref=arb[poz].suf=arb[poz].best=1;
       arb[poz].lenes=0;
       arb[poz].val_lenes=0;
       return;         
   }  
   
   if(arb[poz].st>=st && arb[poz].dr<=dr)
   {
       arb[poz].lenes=1;
       arb[poz].val_lenes=0;               
       arb[poz].pref=arb[poz].suf=arb[poz].best=(arb[poz].dr-arb[poz].st+1)
       return;               
   }
   
   int mijl=(arb[poz].st+arb[poz].dr)>>1;
   
   if(dr<=mijl)
     update_0(st,dr,poz<<1);
   else if(st>mijl)
     update_0(st,dr,(poz<<1)+1);
   else
     update_0(st,mijl,poz<<1),update_0(mijl+1,dr,(poz<<1)+1);
   recompute(arb[poz],arb[poz<<1],arb[(poz<<1)+1]);
}

void leneveste(int poz,bool tip)
{ 
   arb[poz].lenes=1;
   arb[poz].val_lenes=tip;               
   arb[poz].pref=arb[poz].suf=arb[poz].best=((int)tip)(arb[poz].dr-arb[poz].st+1));
}

void update_1(int st,int dr,int poz)
{
   if(arb[poz].lenes)
   {   
      arb[poz<<1].lenes=1;
      arb[(poz<<1)+1].lenes=1;
      arb[poz<<1].val_lenes=arb[poz].val_lenes;
      arb[(poz<<1)+1].val_lenes=arb[poz].val_lenes;
      arb[poz].lenes=0;                  
   }
   
   if((arb[poz].dr<st) || (arb[poz].st>dr))
     return;
   
   if(st==dr)
   {
       v[st]=1;
       arb[poz].pref=arb[poz].suf=arb[poz].best=0;
       arb[poz].lenes=0;
       arb[poz].val_lenes=0;
       return;         
   }     
   
   if(arb[poz].st>=st && arb[poz].dr<=dr)
   {
       arb[poz].lenes=1;
       arb[poz].val_lenes=1;
       arb[poz].pref=arb[poz].suf=arb[poz].best=0;              
       return;               
   }
   
   int mijl=(arb[poz].st+arb[poz].dr)>>1;
   
   if(dr<=mijl)
     update_1(st,dr,poz<<1);
   else if(st>mijl)
     update_1(st,dr,(poz<<1)+1);
   else
     update_1(st,mijl,poz<<1),update_1(mijl+1,dr,(poz<<1)+1);
   recompute(arb[poz],arb[poz<<1],arb[(poz<<1)+1]);
}

void query(int st,int dr,int poz)
{
   if(arb[poz].lenes==1)
   {
      if(arb[poz].val_lenes)
      {
         arb[poz].                   
      }
      else
      {
             
      }                     
   }  
   
   if((arb[poz].dr<st) || (arb[poz].st>dr))
     return; 
   if(st==dr)
   {
       recompute(aux,aux,arb[poz]);      
       return;         
   }    
   
   if(arb[poz].st>=st && arb[poz].dr<=dr)
   {
       arb[poz].lenes=1;
       arb[poz].val_lenes=1;               
       return;               
   }     
   
   
}

int main()
{
    /*
    gol.st=0;
    gol.dr=0;
    plin.st=0;
    plin.dr=0;
    */
    gol.suf=
    system("PAUSE");
    return 0;
}