Cod sursa(job #3172195)

Utilizator emazareMazare Emanuel emazare Data 20 noiembrie 2023 12:01:35
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <fstream>

using namespace std;

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

const int Nmax = 100005;
struct arbint{
    int st;
    int dr;
    int mid;
    int lazy;
} aint[4*Nmax];

void build(int node, int st, int dr){
    if(st == dr){
        aint[node].st = 1;
        aint[node].dr = 1;
        aint[node].mid = 1;
        aint[node].lazy = -1;
        return;
    }
    int mid = (st+dr)/2;
    build(node+node, st, mid);
    build(node+node+1, mid+1, dr);
    aint[node].st = aint[node].dr = aint[node].mid = dr-st+1; aint[node].lazy = -1;
}
void update(int node, int st, int dr, int x, int y, int val){
    if(st == x && dr == y){
        if(val == 0){
            aint[node].st = aint[node].dr = aint[node].mid = dr-st+1;
            aint[node].lazy = 0;
        }
        else{
            aint[node].st = aint[node].dr = aint[node].mid = 0;
            aint[node].lazy = 1;
        }
        return;
    }
    if(aint[node].lazy == 0){
        aint[node+node].st = aint[node+node].dr = aint[node+node].mid = dr-st+1;
        aint[node+node+1].st = aint[node+node+1].dr = aint[node+node+1].mid = dr-st+1;
        aint[node+node].lazy = aint[node+node+1].lazy = 0;
        aint[node].lazy = -1;
    }
    else if(aint[node].lazy == 1){
        aint[node+node].st = aint[node+node].dr = aint[node+node].mid = 0;
        aint[node+node+1].st = aint[node+node+1].dr = aint[node+node+1].mid = 0;
        aint[node+node].lazy = aint[node+node+1].lazy = 1;
        aint[node].lazy = -1;
    }
    int mid = (st+dr)/2;
    if(y<=mid)
        update(node+node,st,mid,x,y,val);
    else if(x>mid)
        update(node+node+1,mid+1,dr,x,y,val);
    else{
        update(node+node,st,mid,x,mid,val);
        update(node+node+1,mid+1,dr,mid+1,y,val);
    }
    aint[node].mid = max(aint[node+node].mid, aint[node+node+1].mid);
    aint[node].mid = max(aint[node].mid, aint[node+node].dr+aint[node+node+1].st);
    aint[node].st = aint[node+node].st;
    if(aint[node+node].st == mid-st+1)
        aint[node].st+=aint[node+node+1].st;
    aint[node].dr = aint[node+node+1].dr;
    if(aint[node+node+1].dr == dr-mid)
        aint[node].dr+=aint[node+node].dr;
}

int main()
{
    int n,p;
    fin >> n >> p;
    for(int i=1;i<=p;i++){
        int c;
        fin >> c;
        if(c == 3)
            fout << aint[1].mid << '\n';
        else{
            int x,y;
            fin >> x >> y;
            y = x+y-1;
            if(c == 1)
                update(1,1,n,x,y,1);
            else if(c == 2)
                update(1,1,n,x,y,0);
        }
    }
    return 0;
}