Cod sursa(job #2510585)

Utilizator eusebiu_alexandruMorar Eusebiu eusebiu_alexandru Data 16 decembrie 2019 21:56:17
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<fstream>
#define nmax 130005
using namespace std;
ifstream f ("hotel.in");
ofstream g ("hotel.out");
struct ele
{
  int sol,st,dr;
};
ele v[4*nmax];
int i,j,a,b,cati,cerinta,valoare,mij,n,p,lg,pozitie;
void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        v[nod].sol=valoare;
        v[nod].dr=valoare;
        v[nod].st=valoare;
        return;
    }
      int  mij=(st+dr)/2;
    if(pozitie<=mij)
       update(2*nod,st,mij);
    else
       update(2*nod+1,mij+1,dr);
    v[nod].st=v[nod*2].st;
    v[nod].dr=v[nod*2+1].dr;
    v[nod].sol=v[nod*2].dr+v[nod*2+1].st;
    if(v[nod*2].sol>v[nod].sol)
         v[nod].sol=v[nod*2].sol;
    if(v[nod*2+1].sol>v[nod].sol)
         v[nod].sol=v[nod*2+1].sol;
    if(v[2*nod].st==mij-st+1)
        v[nod].st+=v[2*nod+1].st;
    if(v[2*nod+1].dr==dr-mij)
        v[nod].dr+=v[2*nod].dr;
}
int main()
{
 f>>n>>p;
 valoare=1;
 for(i=1;i<=n;i++)
 {
     valoare=1;
     pozitie=i;
     update(1,1,n);
 }
 while(p)
 {
     p--;
     f>>cerinta;
     if(cerinta==1)
     {
         f>>a>>b;
         b=a+b-1;
         for(j=a;j<=b;j++)
         {
             pozitie=j;
             valoare=0;
             update(1,1,n);
         }
     }
     if(cerinta==2)
     {
         f>>a>>b;
         b=a+b-1;
         for(j=a;j<=b;j++)
         {
             pozitie=j;
             valoare=1;
             update(1,1,n);
         }
     }
     if(cerinta==3)
         g<<v[1].sol<<'\n';
 }
}