Cod sursa(job #2655708)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 5 octombrie 2020 11:57:59
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;

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

const int NMAX = 100005;

typedef long long ll;

ll n, m, ma, s;
ll frunza[4 * NMAX];
ll lazy[NMAX * 4];
ll AintS[NMAX * 4]; //- subsecventa pe intervalul lui nod
ll AintL[4 * NMAX];// -subsecventa de suma maxima care incepe din st lui nod si se termina tot in intervalul lui
ll AintR[4 * NMAX];// -subsecventa de suma maxima care se termina pe dr lui nod
ll AintM[4 * NMAX]; //-subscventa de suma maxima din intervalul lui nod

void build(int nod, int l, int r) {
	if (l == r) {
		AintL[nod] = AintR[nod] = AintM[nod] = AintS[nod] = 1;
		frunza[nod] = 1;
		return;
	}
	int mj = (l + r) / 2;
	build(nod * 2, l, mj);
	build(nod * 2 + 1, mj + 1, r);
	AintS[nod] = AintS[nod * 2] + AintS[nod * 2 + 1];
	AintM[nod] = max(AintR[nod * 2] + AintL[nod * 2 + 1], max(AintM[nod * 2], AintM[nod * 2 + 1]));
	AintL[nod] = max(AintL[nod * 2], AintS[nod * 2] + AintL[nod * 2 + 1]);
	AintR[nod] = max(AintR[nod * 2 + 1], AintS[nod * 2 + 1] + AintR[nod * 2]);

}

void propagare(int nod) {
	if (lazy[nod] != -1) {
		AintL[nod] = AintR[nod] = AintM[nod] = AintS[nod] = lazy[nod];
		if (nod * 2 < NMAX * 4 && frunza[nod] == 0)
			lazy[nod * 2] = lazy[nod];
		if (nod * 2 + 1 < NMAX * 4 && frunza[nod] == 0)
			lazy[nod * 2 + 1] = lazy[nod];
		lazy[nod] = -1;
	}
}

void update(int nod, int l, int r, int st, int dr, int val) {
	propagare(nod);
	if (l >= st and r <= dr) {
		lazy[nod] = val;
		return;
	}
	int mj = (l + r) / 2;
	if (st <= mj)
		update(nod * 2, l, mj, st, dr, val);
	if (dr > mj)
		update(nod * 2 + 1, mj + 1, r, st, dr, val);
	propagare(nod * 2);
	propagare(nod * 2 + 1);
	AintS[nod] = AintS[nod * 2] + AintS[nod * 2 + 1];
	AintM[nod] = max(AintR[nod * 2] + AintL[nod * 2 + 1], max(AintM[nod * 2], AintM[nod * 2 + 1]));
	AintL[nod] = max(AintL[nod * 2], AintS[nod * 2] + AintL[nod * 2 + 1]);
	AintR[nod] = max(AintR[nod * 2 + 1], AintS[nod * 2 + 1] + AintR[nod * 2]);
}

void Query(long long nod, long long le, long long ri, long long x, long long y) {

	if (x <= le and ri <= y) {

		ma = max(ma, AintM[nod]);
		ma = max(ma, s + AintL[nod]);
		s = max(s + AintS[nod], AintR[nod]);

		return;
	}

	long long mj = (le + ri) / 2;
	if (x <= mj)
		Query(nod * 2, le, mj, x, y);
	if (y >= mj + 1)
		Query(nod * 2 + 1, mj + 1, ri, x, y);
}

int main() {

	int x, y, type;

	fin >> n >> m;
	for (int i = 1; i <= n * 4; ++i)
		lazy[i] = -1;
	build(1, 1, n);
	for (int i = 1; i <= m; ++i) {
		fin >> type;
		if (type == 1) {
			fin >> x >> y;
			update(1, 1, n, x, x + y - 1, -100000);
			continue;
		}

		if (type == 2) {
			fin >> x >> y;
			update(1, 1, n, x, x + y - 1, 1);
		}

		else {
			ma = s = 0;
			Query(1, 1, n, 1, n);
			fout << ma << "\n";
		}
	}
}