Cod sursa(job #2510004)

Utilizator ivddabDabelea Ioana-Viviana ivddab Data 15 decembrie 2019 16:13:13
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#define NM 100006
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int A,B,n,p,c;
struct {
  int lf,rg,act,nr;
}a[4*NM];
void update( int nod,int st,int dr ){
  int mijl,lch,rch;
  if(st==dr){
     if(c==2) a[nod].lf=a[nod].rg=a[nod].nr=1;
       else   a[nod].lf=a[nod].rg=a[nod].nr=0;
    a[nod].act=1;
    return;
  }
  mijl=(st+dr)/2;
  lch=2*nod; rch=2*nod+1;
//  if(a[nod].act==1){
//    a[nod].act=0;
//    if(a[nod].nr!=0){
//        int val;
//        val=mijl-st+1; a[lch].lf=a[lch].rg=a[lch].nr=mijl-st+1;
//        val=dr-mijl;   a[rch].lf=a[rch].rg=a[rch].nr=dr-mijl;
//        a[lch].act=a[rch].act=1;
//    } else { a[lch].lf=a[lch].rg=a[lch].nr=0; a[rch].lf=a[rch].rg=a[rch].nr=0;
//             a[lch].act=a[rch].act=1;
//           }
//  }
  if(A<=mijl) update(lch,st,mijl);
  if(B>mijl)  update(rch,mijl+1,dr);
  lch=2*nod; rch=2*nod+1;
  a[nod].nr=max(a[lch].nr,a[rch].nr); a[nod].nr=max(a[nod].nr,a[lch].rg+a[rch].lf);
  a[nod].lf=a[lch].lf;
  if(a[lch].lf==mijl-st+1) a[nod].lf+=a[rch].lf;
  a[nod].rg=a[rch].rg;
  if(a[rch].rg==dr-mijl)   a[nod].rg+=a[lch].rg;
}
int main()
{
    f>>n>>p; //g<<n<<' ';
    c=2; A=1; B=n;
    update(1,1,n);
    while(p!=0){ p--;
        f>>c;
        if(c==3) g<<max(max(a[1].lf,a[1].rg),a[1].nr)<<'\n';
          else   { f>>A>>B; B=A+B-1; update(1,1,n); }
    }
    return 0;
}