Cod sursa(job #462637)

Utilizator APOCALYPTODragos APOCALYPTO Data 12 iunie 2010 15:11:44
Problema Hotel Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
using namespace std;
#include<iostream>
#include<fstream>
int N;
int P;
int H[100005],st[100005],dr[100005];
#define common int L=2*n,R=L+1,m=(l+r)>>1
ofstream fout("hotel.out");
void update1(int n,int l,int r,int ql,int qr)
{
    if(ql<=l&&qr>=r)
    { H[n]=0;
      st[n]=0;
      dr[n]=0;
     return ;

    }
    common;
    if(H[n]==r-l+1)
    {H[L]=st[L]=dr[L]=m-l+1;
    H[R]=st[R]=dr[R]=r-(m+1)+1;
    H[n]=st[n]=dr[n]=0;
    }
    if(ql<=m) update1(L,l,m,ql,qr);
    if(qr>m)     update1(R,m+1,r,ql,qr);
    st[n]=st[L];
    if(st[L]==m-l+1) st[n]+=st[R];
    dr[n]=dr[R];
    if(dr[R]==r-(m+1)+1) dr[n]+=dr[L];

    H[n]=max(H[L],H[R]);
    H[n]=max(st[R]+dr[L],H[n]);
    H[n]=max(H[n],max(st[n],dr[n]));

}

void update2(int n,int l,int r,int ql,int qr)
{
    if(ql<=l&&qr>=r)
    {
        H[n]=st[n]=dr[n]=r-l+1;
        return;
    }
    common;
    if(H[n]==0)
    {st[L]=dr[L]=st[R]=dr[R]=H[L]=H[R]=0;
    }
    if(ql<=m) update2(L,l,m,ql,qr);
    if(qr>m) update2(R,m+1,r,ql,qr);

    st[n]=st[L];
    if(st[L]==m-l+1) st[n]+=st[R];
    dr[n]=dr[R];
    if(dr[R]==r-(m+1)+1) dr[n]+=dr[L];

    H[n]=max(H[L],H[R]);
    H[n]=max(st[R]+dr[L],H[n]);
    H[n]=max(H[n],max(st[n],dr[n]));
}
void cit()
{int i,x,y,z;
    ifstream fin("hotel.in");
    fin>>N>>P;

    update2(1,1,N,1,N);

    for(i=1;i<=P;i++)
      {fin>>x;

      if(x!=3)
      {if(x==1)
        {fin>>y>>z;
        update1(1,1,N,y,y+z-1);
        }
       else
        {fin>>y>>z;
        update2(1,1,N,y,z+y-1);
        }
      }
      else
       fout<<H[1]<<"\n";
      }


}

int main()
{   cit();
fout.close();
    return 0;
}