Cod sursa(job #285001)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 22 martie 2009 11:07:06
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <stdio.h>

#define maxn 600010

using namespace std;

long n, i, j, k, m, cod, left, right;
long st[maxn], dr[maxn], sum[maxn];

void init(long x, long l, long r)
{
    long m=(l+r)/2;
    st[x]=dr[x]=sum[x]=r-l+1;
    if(l==r) return;
    init(x*2, l, m);
    init(x*2+1, m+1, r);
}

void update(long x, long l, long r)
{
    long m=(l+r)/2;
   // printf("*");
    if(left <= l && r <= right)
    {
        if(cod==1)
        {
            st[x]=dr[x]=sum[x]=0;
        }
        else
        {
            st[x]=dr[x]=sum[x]=r-l+1;
        }
        return;
    }
    if(cod==1 && sum[x]==(r-l+1) )
    {
        sum[x*2]=dr[x*2]=st[x*2]=m-l+1;
        sum[x*2+1]=dr[x*2+1]=st[x*2+1]=r-m;
    }
    if(cod==2 && sum[x]==0)
    {
        sum[x*2]=dr[x*2]=st[x*2]=0;
        sum[x*2+1]=dr[x*2+1]=st[x*2+1]=0;
    }
    if(left<=m) update(2*x, l, m);
    if(m<right) update(2*x+1, m+1, r);
    if(sum[2*x]==m-l+1)
    {
        st[x]=sum[2*x]+st[2*x+1];
    }
    else
    {
        st[x]=st[2*x];
    }
    if(sum[2*x+1]==r-m)
    {
        dr[x]=sum[2*x+1]+dr[2*x];
    }
    else
    {
        dr[x]=dr[2*x+1];
    }    
    sum[x]=st[2*x+1]+dr[2*x];
    if(dr[x]>sum[x]) sum[x]=dr[x];
    if(st[x]>sum[x]) sum[x]=st[x];
    if(sum[2*x]>sum[x]) sum[x]=sum[2*x];
    if(sum[2*x+1]>sum[x]) sum[x]=sum[2*x+1];
}

int main()
{
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);
    scanf("%d %d", &n, &m);
    init(1, 1, n);
    for(i=1; i<=m; i++)
    {
        scanf("%d", &cod);
        if(cod<=2)
        {
            scanf("%d %d", &left, &right);
            right+=left-1;
        //    printf("%d %d\n", left, right);
            update(1, 1, n);
        }
        else printf("%d\n", sum[1]);
    }
    return 0;
}