Cod sursa(job #1538546)

Utilizator DobosDobos Paul Dobos Data 29 noiembrie 2015 13:03:39
Problema Hotel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 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){
    if(l == r){
        v[nod].mx = v[nod].l = v[nod].r = 1;
        return;
    }
    int mij = (l+r) >> 1;
    buildtree(nod * 2 + 1,mij + 1,r);
    buildtree(nod * 2,l,mij);
    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 == v[2*nod].mx && v[2*nod].l == v[2*nod].r)
            v[nod].l = v[nod].mx;
        else
            v[nod].l = v[2*nod].l;
        if(v[2*nod + 1].r == v[2*nod + 1].mx && v[2*nod + 1].r == v[2*nod + 1].l)
            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;
    }
}
void update(int nod,int l,int r,int m,int M,int q){
    if(lazy[nod]){
        if(lazy[nod] == 1){
            v[nod].mx = v[nod].l = v[nod].r = 0;
            if(l != r)
                lazy[2 * nod] = lazy[2 * nod + 1] = 1;

        } else {
            v[nod].mx = v[nod].l = v[nod].r = r - l + 1;
            if(l != r)
                lazy[2 * nod] = lazy[2 * nod + 1] = 2;
        }
        lazy[nod] = 0;
    }
    if(l > r || l > M || r < m) return;
    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;
        if(r != l){
            lazy[2*nod] = q;
            lazy[2*nod + 1] = q;
        }
        return ;
    }
    int mij = (l + r) >> 1;
    update(2 * nod,l,mij,m,M,q);
    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 == v[2*nod].mx && v[2*nod].l == v[2*nod].r)
            v[nod].l = v[nod].mx;
        else
            v[nod].l = v[2*nod].l;
        if(v[2*nod + 1].r == v[2*nod + 1].mx && v[2*nod + 1].r == v[2*nod + 1].l)
            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;
}