Cod sursa(job #793789)

Utilizator valentina506Moraru Valentina valentina506 Data 4 octombrie 2012 09:44:31
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,i,j,m,a[300001],st[300001],dr[300001],val,poz;
int x,xi,xf;

void build(int nod,int left,int right)
{
    int mij;
    if(left==right)
    {
        a[nod]=st[nod]=dr[nod]=1;
        return;
    }

    mij=(left+right)/2;

    if(poz<=mij)
    build(2*nod,left,mij);
    else
    build(2*nod+1,mij+1,right);

    a[nod]=a[nod*2]+a[nod*2+1];
    st[nod]=a[nod];
    dr[nod]=a[nod];

}

void update(int nod,int left,int right,int val)
{
    int mij;

    if(left>=xi&&right<=xf)
    {
        if(x==2)
        val=right-left+1;
        else
        val=0;
        a[nod]=st[nod]=dr[nod]=val;
        return;
    }
        mij=(left+right)/2;
        if(a[nod]==0)
        {
            a[2*nod]=a[2*nod+1]=0;
            st[2*nod]=st[2*nod+1]=0;
            dr[2*nod]=dr[2*nod+1]=0;
        }
        if(a[nod]==right-left+1)
        {
            a[2*nod]=st[2*nod]=dr[2*nod]=mij-left+1;
            a[2*nod+1]=st[2*nod+1]=dr[2*nod+1]=right-mij;
        }

        if(xi<=mij)
        update(nod*2,left,mij,val);
        if(xf>mij)
        update(nod*2+1,mij+1,right,val);
        a[nod]=max(a[2*nod],max(a[2*nod+1],dr[2*nod]+st[2*nod+1]));

        if(st[2*nod]<mij-left+1)
         st[nod]=st[2*nod];
         else
        st[nod]=st[2*nod]+st[2*nod+1];

        if(dr[2*nod+1]<right-mij)
        dr[nod]=dr[2*nod+1];
        else
        dr[nod]=dr[2*nod]+dr[2*nod+1];

}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
    {
        val=1;
        poz=i;
      build(1,1,n);
    }

    for(i=1;i<=m;++i)
    {
        f>>x;
        if(x==3)
        g<<a[1]<<"\n";
        else
        {
            f>>xi>>xf;
            xf+=xi-1;
            if(x==2)
                update(1,1,n,1);
            else
            if(x==1)
                update(1,1,n,0);
        }
    }

    return 0;
}