Cod sursa(job #1742582)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 16 august 2016 17:32:21
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <cstdio>
#include <cctype>
#define MAXBUF (1<<20)
#define MAXN 100000
FILE*fi,*fout;
char buf[MAXBUF];
int pos=MAXBUF;
inline char nextch(){
    if(pos==MAXBUF){
        fread(buf,1,MAXBUF,fi);
        pos=0;
    }
    return buf[pos++];
}
inline int getnr(){
   char a=nextch();
   char sign=1;
   if(a=='-')
      sign=-1;
   while(isdigit(a)==0)
      a=nextch();
   int nr=0;
   while(isdigit(a)==1){
      nr=nr*10+a-'0';
      a=nextch();
   }
   return nr*sign;
}
inline int getmax(int a,int b){
    if(a>b) return a;
    return b;
}
struct Aint{
   int max_lenght;
   int first_lenght;
   int last_lenght;
   inline void reset(int val){
       max_lenght=first_lenght=last_lenght=val;
   }
};
Aint A[4*MAXN+1];
void update(int nod,int left,int right,int l,int r,char free){
    if(l<=left&&right<=r){
        if(free==1)
            A[nod].reset(right-left+1);
        else
            A[nod].reset(0);
    }
    else{
        int med=(left+right)/2;
        if(A[nod].max_lenght==0){
            A[2*nod].reset(0);
            A[2*nod+1].reset(0);
        }
        if(A[nod].max_lenght==right-left+1){
            A[2*nod].reset(med-left+1);
            A[2*nod+1].reset(right-med);
        }
        if(l<=med)
          update(2*nod,left,med,l,r,free);
        if(med<r)
          update(2*nod+1,med+1,right,l,r,free);
        A[nod].max_lenght=getmax(A[2*nod].last_lenght+A[2*nod+1].first_lenght,getmax(A[2*nod].max_lenght,A[2*nod+1].max_lenght));
        if(A[2*nod].first_lenght==med-left+1)
           A[nod].first_lenght=A[2*nod].first_lenght+A[2*nod+1].first_lenght;
        else
           A[nod].first_lenght=A[2*nod].first_lenght;
        if(A[2*nod+1].last_lenght==right-med)
           A[nod].last_lenght=A[2*nod].last_lenght+A[2*nod+1].last_lenght;
        else
           A[nod].last_lenght=A[2*nod+1].last_lenght;
    }
}
int main(){
   int i,n,l,x,q,t;
   fi=fopen("hotel.in" ,"r");
   fout=fopen("hotel.out" ,"w");
   n=getnr();
   for(i=1;i<=n;i++)
      update(1,1,n,i,i,1);
   q=getnr();
   while(q>0){
      q--;
      t=getnr();
      if(t==1){
        l=getnr();
        x=getnr();
        update(1,1,n,l,l+x-1,0);
      }
      if(t==2){
        l=getnr();
        x=getnr();
        update(1,1,n,l,l+x-1,1);
      }
      if(t==3)
        fprintf(fout,"%d\n" ,A[1].max_lenght);
   }
   fclose(fi);
   fclose(fout);
   return 0;
}