Cod sursa(job #1538582)

Utilizator DobosDobos Paul Dobos Data 29 noiembrie 2015 14:17:46
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int BMAX = 500;
const int NMAX = 400000;
char buffer[BMAX + 1];
int bpoz = BMAX - 1;
struct hotel{
int mx,l,r;
}v[NMAX];
int lazy[NMAX];
void parsare(int &x){
    while(!isdigit(buffer[bpoz])){
        bpoz++;
        if(bpoz == BMAX){
            bpoz = 0;
            fin.read(buffer,BMAX);
        }
    }
    x = 0;
    while(isdigit(buffer[bpoz])){
        x = x * 10 + (buffer[bpoz] - '0');
        bpoz++;
        if(bpoz == BMAX){
            bpoz = 0;
            fin.read(buffer,BMAX);
        }
    }
}
void buildtree(int nod,int l,int r){
    v[nod].mx = v[nod].l = v[nod].r = r - l + 1;
    int mij = (l+r) >> 1;
    if(l == r)
        return ;
    buildtree(nod * 2 + 1,mij + 1,r);
    buildtree(nod * 2,l,mij);
}
void update(int nod,int l,int r,int m,int M,int q){

    if(l >= m && r <= M){
        if(q == 1)
            v[nod].mx = v[nod].l = v[nod].r = 0;
        else
             v[nod].mx = v[nod].l = v[nod].r = r - l + 1;
        return ;
    }
    int mij = (l + r) >> 1;
    if(v[nod].mx == 0){
        v[2 * nod].mx = v[2 * nod].l = v[2 * nod].r = 0;
        v[2 * nod + 1].mx = v[2 * nod + 1].l = v[2 * nod + 1].r = 0;
    }
    if(v[nod].mx == r - l + 1){
        v[2 * nod].mx = v[2 * nod].l = v[2 * nod].r = mij - l + 1;
        v[2 * nod + 1].mx = v[2 * nod + 1].l = v[2 * nod + 1].r = r - mij;
    }
    if(m <= mij)
    update(2 * nod,l,mij,m,M,q);
    if(M > mij)
    update(2 * nod + 1,mij+1,r,m,M,q);
    int mx = max(v[2 * nod].mx,v[2 * nod + 1].mx);
    if( v[2*nod].r + v[2*nod + 1].l > mx){
        v[nod].mx = v[2*nod].r  + v[2*nod + 1].l;
        if(v[2 * nod].l == mij - l + 1)
            v[nod].l = v[nod].mx;
        else
            v[nod].l = v[2*nod].l;
        if( v[nod * 2 + 1].r == r - mij)
            v[nod].r = v[nod].mx;
        else
            v[nod].r = v[2*nod+1].r;
    } else {
        v[nod].mx = mx;
        v[nod].l = v[2*nod].l;
        v[nod].r = v[2*nod+1].r;
    }
}
int main()
{
    int n,m,x,M,q;
    parsare(n); parsare(m);
    buildtree(1,1,n);
    for(int i = 1; i <= m; i++){
        parsare(q);
        if(q == 3)
            fout << v[1].mx << "\n";
        else{
            parsare(x); parsare(M);
           if(q == 1)
                update(1,1,n,x,x + M-1,1);
            if(q == 2)
                update(1,1,n,x, x + M-1,2);
        }
    }
    return 0;
}