Cod sursa(job #1952762)

Utilizator Garen456Paun Tudor Garen456 Data 4 aprilie 2017 12:53:48
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#define nmax 100050
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

struct ar
{
  int best,right,left;
};
ar arb[4*nmax];
int n,m,Narb,x,y,op;


void update(int node,int left,int right){
    int middle=(left+right)/2;
    if(left>y||right<x)
        return;
    if(x<=left&&right<=y){
        if(op==1)
            arb[node].best=arb[node].left=arb[node].right=0;
        else
            arb[node].best=arb[node].left=arb[node].right=right-left+1;
        return;
    }
    if(arb[node].best==0)
        arb[2*node].best=arb[2*node].left=arb[2*node].right=arb[2*node+1].best=arb[node*2+1].left=arb[2*node+1].right=0;
    if(arb[node].best==right-left+1){
        arb[2*node].best=arb[2*node].left=arb[2*node].right=middle-left+1;
        arb[2*node+1].best=arb[2*node+1].left=arb[2*node+1].right=right-middle;
    }
    update(2*node,left,middle);
    update(2*node+1,middle+1,right);
    arb[node].best=max(max(arb[2*node].best,arb[2*node+1].best),arb[2*node].right+arb[2*node+1].left);
    arb[node].left=arb[2*node].left;
    arb[node].right=arb[2*node+1].right;
    if(arb[2*node].left==middle-left+1)
        arb[node].left+=arb[2*node+1].left;
    if(arb[2*node+1].right==right-middle)
        arb[node].right+=arb[2*node].right;
}
int main()
{  fin>>n>>m;
   int i;
Narb=1;
  while(Narb<n) Narb*=2;

  for(i=0;i<n;++i)
    arb[Narb+i].best=arb[Narb+i].right=arb[Narb+i].left=1;

  for(i=Narb-1;i>=1;--i)
     arb[i].best=arb[i].right=arb[i].left=arb[i*2].right+arb[i*2+1].left;

   for(i=1;i<=m;++i)
   {  fin>>op;
        if(op==3)
            fout<<arb[1].best<<'\n';
         else{
            fin>>x>>y;
            y+=x-1;
            update(1,1,Narb);
         }
   }
    return 0;
}