Cod sursa(job #1171515)

Utilizator andrei_toaderToader Andrei Sorin andrei_toader Data 15 aprilie 2014 20:50:12
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
#include<string.h>
FILE*fin=fopen("hotel.in","r");
FILE*fout=fopen("hotel.out","w");
#define nm 400000
#define max(a,b)((a)>(b)?(a):(b))
int n,p,lfs[nm],lst[nm],ldr[nm];
void buildt(int nod,int l,int r)
{
    if(l>r) return ;
    if(l==r)
    {
      lfs[nod]=1;
      lst[nod]=1;
      ldr[nod]=1;
      return ;
    }
    int mid=(l+r)/2;
    lfs[nod]=lst[nod]=ldr[nod]=r-l+1;
    buildt(2*nod,l,mid);
    buildt(2*nod+1,mid+1,r);
}
void update(int nod,int l,int r,int a,int b,int v,int pass)
{
     if(a<=l&&r<=b)
     {
       if(v){lfs[nod]=lst[nod]=ldr[nod]=0;}
       else{lfs[nod]=lst[nod]=ldr[nod]=r-l+1;}
       return ;
     }
     int mid=(l+r)/2,pc=pass,udr=0,ust=0,ls=nod<<1,rs=ls+1;
     if(pass<0&&lfs[nod]==r-l+1) pc=0;
     if(pass<0&&lfs[nod]==0) pc=1;
     if(a<=mid)
     {
       ust=1;
       update(2*nod,l,mid,a,b,v,pc);
     }
     if(b>=mid+1)
     {
       udr=1;
       update(2*nod+1,mid+1,r,a,b,v,pc);
     }
     if(pc==0)
     {
       if(!ust){lfs[ls]=lst[ls]=ldr[ls]=mid-l+1;}
       if(!udr){lfs[rs]=lst[rs]=ldr[rs]=r-mid;}
     }
     else if(pc==1)
          {
            if(!ust){lfs[ls]=lst[ls]=ldr[ls]=0;}
            if(!udr){lfs[rs]=lst[rs]=ldr[rs]=0;}
          }
     lfs[nod]=max(lfs[ls],lfs[rs]);
     lfs[nod]=max(lfs[nod],ldr[ls]+lst[rs]);
     lst[nod]=lst[ls];
     if(lst[ls]==mid-l+1) lst[nod]+=lst[rs];
     ldr[nod]=ldr[rs];
     if(ldr[rs]==r-mid) ldr[nod]+=ldr[ls];
}
int main()
{
    int i,a,b,q;
    fscanf(fin,"%d%d",&n,&p);
    buildt(1,1,n);
    for(i=1;i<=p;i++)
    {
      fscanf(fin,"%d",&q);
      if(q==1||q==2)
      {
        fscanf(fin,"%d%d",&a,&b);
        b=a+b-1;
        update(1,1,n,a,b,q%2,-1);
      }
      else fprintf(fout,"%d\n",lfs[1]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}