Cod sursa(job #1060652)

Utilizator IonSebastianIon Sebastian IonSebastian Data 18 decembrie 2013 12:08:46
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <fstream>

using namespace std;

ifstream in("hotel.in");
ofstream out("hotel.out");

int pc, nr, n, p, i;
struct hotel{
    int secv;
    int prefix;
    int sufix;
}t[1<<25];
bool liber, plin;

int maxim(int a, int b, int c){
    if(a < b){
        if(b < c){
            return c;
        } else{
            return b;
        }
    } else {
        if(a < c){
            return c;
        } else {
            return a;
        }
    }
}

void ocupa(int p, int st, int dr){
    if(liber){
        t[p].secv = t[p].prefix = t[p].sufix = dr-st+1;
    }
    if(pc <= st && dr <= nr){
        t[p].secv = t[p].prefix = t[p].sufix = 0;
        return;
    }
    if(dr < pc || st > nr){
        return;
    }
    if(t[p].secv == dr-st+1 && !liber){
        liber = true;
        ocupa(2*p, st, (st+dr)/2);
        ocupa(2*p+1,(st+dr)/2+1, dr);
        liber = false;
    } else {
        ocupa(2*p,st, (st+dr)/2);
        ocupa(2*p+1,(st+dr)/2+1, dr);
      }
    t[p].secv = maxim(t[2*p].secv, t[2*p+1].secv, t[2*p].sufix+t[2*p+1].prefix);
    if(t[2*p].prefix == (st+dr)/2-st+1){
        t[p].prefix = t[2*p].prefix + t[2*p+1].prefix;
    } else {
        t[p].prefix = t[2*p].prefix;
    }
    if(t[2*p+1].sufix==dr-(st+dr)/2){
        t[p].sufix=t[2*p].sufix+t[2*p+1].sufix;
    } else{
        t[p].sufix=t[2*p+1].sufix;
    }
}

void elibereaza(int p, int st, int dr){
    if(plin){
        t[p].secv = t[p].prefix = t[p].sufix = 0;
    }
    if(pc <= st && dr <= nr){
        t[p].secv = t[p].prefix = t[p].sufix = dr-st+1;
        return;
    }
    if(dr < pc || st > nr){
        return;
    }
    if(t[p].secv == plin && !plin){
        plin = true;
        elibereaza(2*p, st, (st+dr)/2);
        elibereaza(2*p+1,(st+dr)/2+1, dr);
        plin = false;
    } else {
        elibereaza(2*p,st, (st+dr)/2);
        elibereaza(2*p+1,(st+dr)/2+1, dr);
      }
    t[p].secv = maxim(t[2*p].secv, t[2*p+1].secv, t[2*p].sufix+t[2*p+1].prefix);
    if(t[2*p].prefix == (st+dr)/2-st+1){
        t[p].prefix = t[2*p].prefix + t[2*p+1].prefix;
    } else {
        t[p].prefix = t[2*p].prefix;
    }
    if(t[2*p+1].sufix==dr-(st+dr)/2){
        t[p].sufix=t[2*p].sufix+t[2*p+1].sufix;
    } else{
        t[p].sufix=t[2*p+1].sufix;
    }
}


int main()
{
    char type;
    in >> n >> p;
    t[1].secv = t[1].prefix = t[1].sufix = n;
    for(i = 1; i <= p; i++){
        in >> type;
        if(type == '1'){
            in >> pc >> nr;
            nr += pc - 1;
            ocupa(1,1,n);
        } else {
            if(type == '2'){
                in >> pc >> nr;
                nr += pc - 1;
                elibereaza(1,1,n);
            } else {
                 out << t[1].secv << "\n";
            }
        }
    }
    return 0;
}