Cod sursa(job #1895312)

Utilizator Garen456Paun Tudor Garen456 Data 27 februarie 2017 21:41:47
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#define nmax 100050
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

struct arb
{
  int l;
  int maxl,maxr,maxt;
};
arb a[4*nmax];
int n,m,Narb;

void Change(int i)
{
    int t;

    while(i>0)
    { if(i%2==1) i--;
      t=i/2;

       {
           a[t].maxt=max(a[i].maxt,a[i+1].maxt);
           a[t].maxt=max(a[t].maxt, a[i].maxr+a[i+1].maxl);
           if( a[i].maxl==a[i].l )
              a[t].maxl=a[i].l+a[i+1].maxl;
           else a[t].maxl=a[i].maxl;

           if(a[i+1].maxr==a[i+1].l )
              a[t].maxr=a[i+1].maxr+a[i].maxr;
           else a[t].maxr=a[i+1].maxr;
       }

       i=t;
    }
}

void Change1(int x,int y,int z)
{int i;
    x=x+Narb-1;

    for(i=x;i<=x+y-1;i=i+1)
    {  a[i].maxl=a[i].maxr=a[i].maxt=z;
       Change(i);
    }

}

int main()
{  fin>>n>>m;
   int i;
   Narb=1;
   while(Narb<n) Narb*=2;

   for(i=0;i<n;++i)
      a[Narb+i].l=a[Narb+i].maxl=a[Narb+i].maxr=a[Narb+i].maxt=1;

   for(i=Narb-1;i>=1;--i)
   {    a[i].l=a[i*2].l+a[i*2+1].l;
      a[i].maxt= a[i*2].maxr+a[i*2+1].maxl;
     a[i].maxr=a[i].maxl=a[i].maxt;
   }

   int op,x,y;
   for(i=1;i<=m;++i)
   { fin>>op;
       if(op==3)
        fout<<a[1].maxt<<"\n";
       if(op==1)
       { fin>>x>>y;
           Change1(x,y,0);
       }
       if(op==2)
       { fin>>x>>y;
           Change1(x,y,1);
       }
   }
    return 0;
}