Cod sursa(job #523268)

Utilizator S7012MYPetru Trimbitas S7012MY Data 17 ianuarie 2011 16:57:45
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#define DN 400005
using namespace std;

int n,p,gls,gld,l[DN],r[DN],s[DN];

void v(int vn,int ls, int ld) {
    if(gls<=ls && gld>=ld) {
        l[vn]=r[vn]=s[vn]=0;
        return;
    }
    int m=(ls+ld)>>1,fs=vn<<1;
    if(gls<=m) v(fs,ls,m);
    if(gld>m) v(fs+1,m+1,ld);
    s[vn]=max(max(s[fs],s[fs+1]),l[fs+1]+r[fs] );
    l[vn]=l[fs];
    if(m-ls+1==l[fs]) l[vn]+=l[fs+1];
    r[vn]=r[fs+1];
    if(ld-m==r[fs+1]) r[vn]+=r[fs];
}

void pl(int vn,int ls, int ld) {
    if(gls<=ls && gld>=ld) {
        l[vn]=r[vn]=s[vn]=ld-ls+1;
        return;
    }
    int m=(ls+ld)>>1,fs=vn<<1;
    if(0==s[vn]) {
        s[fs]=l[fs]=r[fs]=0;
        s[fs+1]=l[fs+1]=r[fs+1]=0;
    }
    if(gls<=m) pl(fs,ls,m);
    if(gld>m) pl(fs+1,m+1,ld);
    s[vn]=max(max(s[fs],s[fs+1]),l[fs+1]+r[fs] );
    l[vn]=l[fs];
    if(m-ls+1==l[fs]) l[vn]+=l[fs+1];
    r[vn]=r[fs+1];
    if(ld-m==r[fs+1]) r[vn]+=r[fs];
}

int main()
{
    ifstream f("hotel.in");
    ofstream g("hotel.out");
    f>>n>>p;
    l[1]=r[1]=s[1]=n;
    for(;p;--p) {
        int op;
        f>>op;
        if(3!=op) {
            f>>gls>>gld;
            gld=gls+gld-1;
            if(1==op) v(1,1,n);
            else pl(1,1,n);
        }else g<<s[1]<<'\n';
    }
    return 0;
}