Cod sursa(job #2656232)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 7 octombrie 2020 10:13:09
Problema Hotel Scor 10
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

const int NMAX = 100005;
const int INF = -100;
int n, m;

int v[NMAX + 1];
int lazy[NMAX + 1];
int frunza[NMAX + 1];
int AintS[4 * NMAX]; /// suma pe intervalul lui nod
int AintL[4 * NMAX];// -subsecventa de suma maxima care incepe din st lui nod si se termina tot in intervalul lui
int AintR[4 * NMAX];// -subsecventa de suma maxima care se termina pe dr lui nod
int AintM[4 * NMAX]; //-subscventa de suma maxima din intervalul lui nod

void propagare(int nod, int l, int r) {
	if (lazy[nod]) {
		AintL[nod] = AintR[nod] = AintM[nod] = AintS[nod] = lazy[nod] * (r - l + 1);
		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] = 0;
	}
}

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 update(int nod, int l, int r, int st, int dr, int val) {
	propagare(nod, l, r);
	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, l, mj);
	propagare(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]);
}

int main() {
	int x, y, type;
	fin >> n >> m;
	build(1, 1, n);
	for (int i = 1; i <= m; ++i) {
		fin >> type;

		if (type == 3) {
			propagare(1, 1, n);
			fout << AintM[1] << "\n";
			continue;
		}
		fin >> x >> y;
		int val = 1;
		if (type == 1)
			val = INF;

		update(1, 1, n, x, x + y - 1, val);
	}

}