Cod sursa(job #253246)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 16:34:25
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
 #pragma region Top  
 #include<cstdio>  
 int n,m,i,maxim,x,y,O;  
 char c[100],*b;  
 struct AI{int left,right,middle;};  
 AI a[300000];  
 int M(int a,int b)  
 {  
     if(a>b)  
         return a;  
     return b;  
 }  
 inline void readline()  
 {  
     gets(c);  
     b=c;  
     while(*b==' ') ++b;  
     O=*b-'0';  
     ++b;  
     if(O==3) return;  
     while(*b==' ')++b;  
     x=0;  
     while(*b!=' '){x=x*10+*b-'0';++b;}  
     while(*b==' ')++b;  
     y=0;  
     while(*b>='0'&&*b<='9'){y=y*10+*b-'0';++b;}  
 }  
 #pragma endregion  
 void add(int poz,int st,int dr,int x,int y)  
 {  
     if(x<=st && dr<=y)  
     {  
         a[poz].left=a[poz].right=a[poz].middle=0;  
         return;  
     }  
     int mij=(st+dr)>>1,p=poz<<1;  
     if(a[poz].left==dr-st+1)  
     {  
         a[p].left=a[p].right=a[p].middle=mij-st+1;  
         a[p+1].left=a[p+1].right=a[p+1].middle=dr-mij;  
     }  
     if(x<=mij)  
         add(p,st,mij,x,y);  
     if(mij<y)  
         add(p+1,mij+1,dr,x,y);  
   
     if(!(x<=st && dr<=y))  
     {     
         if(a[p].left==mij-st+1)  
             a[poz].left=a[p].left+a[p+1].left;  
         else  
             a[poz].left=a[p].left;  
         if(a[p+1].right==dr-mij)  
             a[poz].right=a[p].right+a[p+1].right;  
         else  
             a[poz].right=a[p+1].right;  
         a[poz].middle=M(M(a[p].middle,a[p+1].middle),a[p].right+a[p+1].left);  
     }  
 }  
 void remove(int poz,int st,int dr,int x,int y)  
 {  
     if(x<=st && dr<=y)  
     {  
         a[poz].left=a[poz].right=a[poz].middle=dr-st+1;  
         return;  
     }  
     int mij=(st+dr)>>1,p=poz<<1;  
     if(a[poz].left==0 && a[poz].middle==0 && a[poz].right==0)  
     {  
         a[p].left=a[p].right=a[p].middle=0;  
         a[p+1].left=a[p+1].right=a[p+1].middle=0;  
    }  
     if(x<=mij)  
         remove(p,st,mij,x,y);  
     if(mij<y)  
         remove(p+1,mij+1,dr,x,y);  
   
     if(!(x<=st && dr<=y))  
     {     
         if(a[p].left==mij-st+1)  
             a[poz].left=a[p].left+a[p+1].left;  
         else  
             a[poz].left=a[p].left;  
         if(a[p+1].right==dr-mij)  
             a[poz].right=a[p].right+a[p+1].right;  
         else  
             a[poz].right=a[p+1].right;  
         a[poz].middle=M(M(a[p].middle,a[p+1].middle),a[p].right+a[p+1].left);  
     }  
 }  
 int main()  
 {  
     freopen("hotel.in","r",stdin);  
     freopen("hotel.out","w",stdout);  
     scanf("%d %d ",&n,&m);  
     a[1].left=a[1].right=a[1].middle=n;  
     for(i=1;i<=m;i++){  
         readline();  
         switch(O){  
             case 1:add(1,1,n,x,x+y-1);break;  
             case 2:remove(1,1,n,x,x+y-1);break;  
             case 3:printf("%d\n",M(a[1].left,M(a[1].right,a[1].middle)));break;}}  
     fclose(stdout);  
     return 0;  
   }