Cod sursa(job #2643581)

Utilizator GiosinioGeorge Giosan Giosinio Data 20 august 2020 15:00:51
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
#define DIM 100005

using namespace std;

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

int N,P;

struct{
    int vmax, p, q;
}tree[10*DIM];

void initializare(int nod, int st, int dr){
    if(st == dr)
        tree[nod].vmax = tree[nod].p = tree[nod].q = 1;
    else{
        int mij = (st + dr)/2;
        tree[nod].vmax = tree[nod].p = tree[nod].q = dr-st+1;
        initializare(2*nod, st, mij);
        initializare(2*nod+1, mij+1, dr);
    }
}

void recalculation(int nod, int st, int dr){
    int mij = (st + dr)/2;
    tree[nod].vmax = max(max(tree[2*nod].vmax, tree[2*nod+1].vmax), tree[2*nod].q + tree[2*nod+1].p);

    tree[nod].p = tree[2*nod].p;
    if(tree[2*nod].p == mij-st+1)
        tree[nod].p += tree[2*nod+1].p;

    tree[nod].q = tree[2*nod +1].q;
    if(tree[2*nod+1].q == dr - mij)
        tree[nod].q += tree[2*nod].q;
}

void finalizare(int nod, int st, int dr, int op){
    if(op == 1)
        tree[nod].vmax = tree[nod].p = tree[nod].q = 0;
    if(op == 2)
        tree[nod].vmax = tree[nod].p = tree[nod].q = dr - st + 1;

    if(st != dr){
        int mij = (st + dr)/2;
        finalizare(2*nod, st, mij, 1);
        finalizare(2*nod+1, mij+1, dr, 1);
    }
}

void update(int nod, int st, int dr, int a, int b, int op){
    if(a <= st && dr <= b){
        finalizare(nod, st, dr, op);
    }
    else{
        int mij = (st + dr)/2;
        if(a <= mij)
            update(2*nod, st, mij, a, b, op);
        if(b > mij)
            update(2*nod+1, mij+1, dr, a, b, op);
        recalculation(nod,st,dr);
    }
}

int main()
{

    f>>N>>P;
    initializare(1,1,N);
    int op, i, M;
    for(int ind=1; ind<=P; ++ind){
        f>>op;
        if(op == 1 || op == 2){
            f>>i>>M;
            update(1,1,N,i,i+M-1,op);
        }
        if(op == 3)
            g<<tree[1].vmax<<"\n";
    }
}