Cod sursa(job #951809)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 21 mai 2013 19:33:01
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.62 kb
#include <fstream>
 
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(st<dr)
   {
      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)
{
  // cout<<"recomputare:"<<endl;  
   if((b.dr-b.st+1)==b.pref)
   {
   //   cout<<"noroc1"<<endl;                      
      a.pref=b.pref+c.pref;
   }
   else
     a.pref=b.pref;
   //cout<<a.pref<<' '<<b.pref<<' '<<c.pref<<endl;
   if((c.dr-c.st+1)==c.suf)
   {
    //  cout<<"noroc2"<<endl;
     a.suf=c.suf+b.suf;
   }
   else
     a.suf=c.suf;  //GRESEALA: era scris a.pref in loc de suf!!!!!!
   //cout<<a.suf<<' '<<b.suf<<' '<<c.suf<<endl;
   a.best=maxim(b.best,c.best,b.suf+c.pref);
  // cout<<a.best<<' '<<b.best<<' '<<c.best<<endl;
}
 
void fii_lenesi(int poz)
{
      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<<1].suf=arb[poz<<1].pref=arb[poz<<1].best = (1-((int)arb[poz].val_lenes))*(arb[poz<<1].dr-arb[poz<<1].st+1);
      arb[(poz<<1)+1].suf=arb[(poz<<1)+1].pref=arb[(poz<<1)+1].best=(1-((int)arb[poz].val_lenes))*(arb[(poz<<1)+1].dr-arb[(poz<<1)+1].st+1);
 
      arb[poz].lenes=0;
}
 
void update_0(int st,int dr,int poz)
{
  // cout<<"update_0("<<st<<","<<dr<<","<<poz<<")= "<<arb[poz].st<<' '<<arb[poz].dr<<endl;  
   if((arb[poz].dr<st) || (arb[poz].st>dr))
   {
    // cout<<"caz 1"<<endl;                  
     return;
   }
   //cout<<"ccccccccccccccccccc"<<endl;
   if(arb[poz].st==arb[poz].dr && arb[poz].st==st)
   {
   //  cout<<"caz 2"<<endl;
       v[st]=0;
       arb[poz].pref=arb[poz].suf=arb[poz].best=1;
       arb[poz].lenes=0;
       arb[poz].val_lenes=0;
       return;
   }
  // cout<<"b"<<endl;
   if(arb[poz].lenes)
   {
  //   cout<<"caz 4"<<endl;              
       fii_lenesi(poz);
   }
   if(arb[poz].st==st && arb[poz].dr==dr)
   {
  //  cout<<"caz 3"<<endl;
       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;
   }
  // cout<<"a"<<endl;
    // cout<<"caz 5"<<endl;
   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);
     //cout<<"recompute la "<<poz<<' '<<arb[poz].st<<' '<<arb[poz].dr<<endl;
   recompute(arb[poz],arb[poz<<1],arb[(poz<<1)+1]);
}

void update_1(int st,int dr,int poz)
{
   //cout<<"update_1("<<st<<","<<dr<<","<<poz<<")= "<<arb[poz].st<<' '<<arb[poz].dr<<endl;  
   if((arb[poz].dr<st) || (arb[poz].st>dr))
   {
    // cout<<"caz 1"<<endl;                  
     return;
   }
  // cout<<"ccccccccccccccccccc"<<endl;
   if(arb[poz].st==arb[poz].dr && arb[poz].st==st)
   {
  //   cout<<"caz 2"<<endl;
       v[st]=1;
       arb[poz].pref=arb[poz].suf=arb[poz].best=0;
       arb[poz].lenes=0;
       arb[poz].val_lenes=0;
       return;
   }
 //  cout<<"b"<<endl;
   if(arb[poz].lenes)
   {
  //   cout<<"caz 4"<<endl;              
       fii_lenesi(poz);
   }
   if(arb[poz].st==st && arb[poz].dr==dr)
   {
  //   cout<<"caz 3"<<endl;
       arb[poz].lenes=1;
       arb[poz].val_lenes=1;
       arb[poz].pref=arb[poz].suf=arb[poz].best=0;
       return;
   }
 //  cout<<"a"<<endl;
 //    cout<<"caz 5"<<endl;
   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);
     //cout<<"recompute la "<<poz<<' '<<arb[poz].st<<' '<<arb[poz].dr<<endl;
   recompute(arb[poz],arb[poz<<1],arb[(poz<<1)+1]);
}
/* 
void query(int st,int dr,int poz)
{
   if((arb[poz].dr<st) || (arb[poz].st>dr))
     return;
 
   if(arb[poz].st>=st && arb[poz].dr<=dr)
   {
       recompute(aux,aux,arb[poz]);
       return;
   }
 
   if(arb[poz].lenes)
       fii_lenesi(poz);
 
   int mijl=(arb[poz].st+arb[poz].dr)>>1;
 
   if(dr<=mijl)
      query(st,dr,poz<<1);
   else if(st>mijl)
      query(st,dr,(poz<<1)+1);
   else
      query(st,mijl,poz<<1),query(mijl+1,dr,(poz<<1)+1);
}*/
 
int main()
{
    ifstream cin("hotel.in");
    ofstream cout("hotel.out");
    
    int n,p,cod,i,a,b;
    cin>>n>>p;
    build(1,n,1);
    
    for(i=0;i<p;i++)
    {
       cin>>cod;
       if(cod<3)
       {
          cin>>a>>b;
          b=(a+b-1);
       }
       
       if(cod==1)
         update_1(a,b,1);
       else if(cod==2)
         update_0(a,b,1);
       else
       {
       //   aux.st=a;
        //  aux.dr=a-1;
         // aux.lenes=0;
          //aux.val_lenes=0;
         // aux.pref=aux.suf=aux.best=0;
         // query(1,n,1);
          cout<<arb[1].best<<'\n';    
       } 
                       
    }
    /*
    gol.st=0;
    gol.dr=0;
    plin.st=0;
    plin.dr=0;
    */
//    gol.suf=
    cin.close();
    cout.close();
    //system("PAUSE");
    return 0;
}