Cod sursa(job #1895360)

Utilizator Garen456Paun Tudor Garen456 Data 27 februarie 2017 22:02:45
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <queue>
#define nmax 100050
#include <cstring>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
queue <int> C;
struct arb
{
  int l;
  int maxl,maxr,maxt;
};
arb a[4*nmax];
int n,m,Narb;
bool viz[nmax];

void Change()
{
    int t,i;

    while(!C.empty())
    {
      t=C.front();
      C.pop();
      i=t*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;
       }

       if(t/2>0)
       if(viz[t/2]==0)
       {C.push(t/2); viz[t/2]=1; }
    }
    memset(viz,0,sizeof(viz));
}

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


    for(i=x;i<=x+y-1;i++)
    {  a[i].maxl=a[i].maxr=a[i].maxt=z;
     if(i%2==1)  C.push(i/2);
    }
   Change();
}

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;
}