Cod sursa(job #47236)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 3 aprilie 2007 14:37:56
Problema Hotel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.3 kb
#include <stdio.h>

#define maxx 262144

int n,m,l;
int a[maxx],st[maxx],dr[maxx],sum[maxx];
int x,y,z,v;

void update(int p,int r,int nod,int u)
{
     if ((x<=p) && (r<=y)) 
     {
           if (v==1) 
           {
               a[nod]=0;
               st[nod]=0;
               dr[nod]=0;
               sum[nod]=1;
           }
           else {
                     a[nod]=r-p+1;     
                     st[nod]=r-p+1;
                     dr[nod]=r-p+1;
                     sum[nod]=2;
                }
     }
     else {
               int q=(p+r)/2;
               
               if (sum[nod]!=0) u=sum[nod];
               if (u==1)
               {
                    a[nod*2]=0;
                    sum[nod*2]=1;
                    dr[nod*2]=0;
                    st[nod*2]=0;
                    if (n>q) 
                    {
                        dr[nod*2+1]=0;
                        st[nod*2+1]=0;
                        a[nod*2+1]=0;
                        sum[nod*2+1]=1;
                    }
               }
               else if (u==2)
                    {
                        a[nod*2]=q-p+1;
                        sum[nod*2]=2;
                        dr[nod*2]=q-p+1;
                        st[nod*2]=q-p+1;
                        if (n>q)
                        {
                            dr[nod*2+1]=q-p+1;
                            sum[nod*2+1]=2;
                            a[nod*2+1]=q-p+1;
                            st[nod*2+1]=q-p+1;
                        }
                    }
               
			   if (x<=q) update(p,q,nod*2,u);
			   if (y>q) update(q+1,r,nod*2+1,u);

               sum[nod]=0;
               a[nod]=0; 
               st[nod]=0;
               dr[nod]=0;
               
               if ((sum[nod*2]==1) && (sum[nod*2+1]==1)) sum[nod]=1;
			   else if ((sum[nod*2]==2) && (sum[nod*2+1]==2)) sum[nod]=2;
                   
			   if (a[nod*2]>a[nod]) a[nod]=a[nod*2];
			   if (a[nod*2+1]>a[nod]) a[nod]=a[nod*2+1];
               if (dr[nod*2]+st[nod*2+1]>a[nod]) a[nod]=dr[nod*2]+st[nod*2+1];
               
               if (st[nod*2]>st[nod]) st[nod]=st[nod*2];
               if ((sum[nod*2]==2) && (st[nod*2]+st[nod*2+1]>st[nod])) st[nod]=st[nod*2]+st[nod*2+1];
               
               if (dr[nod*2+1]>dr[nod]) dr[nod]=dr[nod*2+1];
               if ((sum[nod*2+1]==2) && (dr[nod*2]+dr[nod*2+1]>dr[nod])) dr[nod]=dr[nod*2]+dr[nod*2+1];
          }
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    
    scanf("%d %d ",&n,&m);
    
    int i,j;
    
    for (l=1;l<n;l<<=1);
    
    for (i=l;i<l+n;i++) 
    {
		st[i]=1;
		dr[i]=1;
        a[i]=1;
        sum[i]=2;
    }
    
    for (i=l-1;i>0;i--)
    {
        sum[i]=2;
        a[i]=a[i*2]+a[i*2+1];
        st[i]=st[i*2]+st[i*2+1];
        dr[i]=dr[i*2]+dr[i*2+1];
    }
    
    
    for (i=1;i<=m;i++) 
    {
		scanf("%d ",&z);
        if (z==1) 
        {
             scanf("%d %d ",&x,&y);
             y+=x-1;
             v=1;
			 update(1,l,1,0);
		}
		else if (z==2)
			 {
				  scanf("%d %d ",&x,&y);
				  y+=x-1;
				  v=0;
				  update(1,l,1,0);
             }
             else printf("%d\n",a[1]);
    }
    
    return 0;
}