Cod sursa(job #2901996)

Utilizator mateicalin2002Ceausu Matei Calin mateicalin2002 Data 15 mai 2022 00:44:59
Problema Hotel Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
 
using namespace std;

const int NMAX = 1e5 + 5;

struct Node {
    int val,maxim,st,dr;
};

Node aint[NMAX];
int maxim = 0;

void init(int nod, int st, int dr)
{
    aint[nod].maxim = dr - st + 1;
	aint[nod].st = dr - st + 1;
	aint[nod].dr = dr - st + 1;
    if(st == dr)
        return;
    init(2 * nod, st, (st + dr) / 2);
    init(2 * nod + 1, (st + dr) / 2 + 1, dr);
}
void update(int nod, int st, int dr, int a, int b, int val)
{
     int mid = st + dr;
     mid /= 2;
 
     if(a <= st && dr <= b) {
        aint[nod].maxim = val * (dr - st + 1);
		aint[nod].st = val * (dr - st + 1);
		aint[nod].dr = val * (dr - st + 1);
        return;
    }
    if (aint[nod].maxim == (1 - val) * (dr - st + 1)) {
		aint[nod * 2].maxim = aint[nod * 2].st = aint[nod * 2].dr = (1 - val) * (mid - st + 1);
		aint[nod * 2 + 1].maxim = aint[nod * 2 + 1].st = aint[nod * 2 + 1].dr = (1 - val) * (dr - mid);
	}
     if(a <= mid) {
        update(nod * 2, st, mid, a, b, val);
     }
     if(b > mid) {
        update(nod * 2 + 1, mid + 1, dr, a, b, val);
     }
     aint[nod].st = aint[nod * 2].st;
     aint[nod].dr = aint[nod * 2 + 1].dr;
     if(aint[nod].st == mid - st + 1)
        aint[nod].st += aint[nod * 2 + 1].st;
     if(aint[nod].dr == dr - mid) {
        aint[nod].dr += aint[nod * 2].dr;
     }
     aint[nod].maxim = max(aint[nod * 2 + 1].maxim, max(aint[nod * 2].maxim, max(aint[nod].st, max(aint[nod].dr, aint[nod * 2].dr + aint[nod * 2 + 1].st))));
}
 
int main()
{
    int n, m;
	freopen("hotel.in", "r", stdin);
	freopen("hotel.out", "w", stdout);
    cin >> n >> m;
    init(1, 1, n);
    while(m > 0) {
        int t;
        cin >> t;
        if(t == 1) {
            int a,b;
            cin >> a >> b;
            update(1, 1, n, a, a + b - 1, 0);
        } else
			if(t == 2) {
				int a,b;
				cin >> a >> b;
				update(1, 1, n, a, a + b - 1, 1);
			} else {
				cout << aint[1].maxim << "\n";
			}
		m--;
    }
    return 0;
}