Cod sursa(job #3145315)

Utilizator itsjerrjerry blake itsjerr Data 14 august 2023 19:29:04
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
// comeback baby!

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 1e5 + 10;
int a[N], val[N], f[N], fi[N], ls[N], block_size;

void process(int idx) {
	f[idx] = 0; fi[idx] = ls[idx] = -1;
	int last = (idx - 1) * block_size + 1;
	for (int i = (idx - 1) * block_size + 1; i <= idx * block_size; ++i) {
		if (a[i]) {
			if (!~fi[idx]) fi[idx] = i;
			ls[idx] = i;
			f[idx] = max(f[idx], i - last - 1);
			last = i;
		}
	}
	f[idx] = max(f[idx], idx * block_size - last);
}

signed main() {
	cin.tie(0)->sync_with_stdio(0);
	if (fopen("hotel.inp", "r")) {
		freopen("hotel.inp", "r", stdin);
		freopen("hotel.out", "w", stdout);
	}

#ifdef LOCAL_MACHINE
	if (fopen("task.inp", "r")) {
		freopen("task.inp", "r", stdin);
		freopen("task.out", "w", stdout);
	}
#endif

	int n, q; cin >> n >> q;
	block_size = sqrt(n);
	
	// cerr << n << " " << block_size << "\n";

	for (int i = 1; i <= (n - 1) / block_size + 1; ++i) {
		f[i] = min(n, i * block_size) - (i - 1) * block_size;
		fi[i] = ls[i] = -1;
	}

	memset(val, -1, sizeof(val));

	while (q--) {
		int type; cin >> type;
		if (type == 3) {
			int last = 0, res = 0;
			for (int i = 1; i <= (n - 1) / block_size + 1; ++i) {
				res = max(res, f[i]);
				if (~fi[i]) res = max(res, fi[i] - last - 1);
				if (~ls[i]) last = ls[i];
			}
			res = max(res, n - last);
			cout << res << "\n";
		}
		else {
			int l, r; cin >> l >> r; r += l - 1;
			int block_L = (l - 1) / block_size + 1;
			int block_R = (r - 1) / block_size + 1;

			if (block_L == block_R) {
				if (~val[block_L]) {
					for (int i = (block_L - 1) * block_size + 1; i <= block_L * block_size; ++i) a[i] = val[block_L];
					val[block_L] = -1;
				}
				for (int i = l; i <= r; ++i) {
					if (type == 1) a[i] = 1;
					else a[i] = 0;
				}
				process(block_L);
				continue;
			}

			for (int i = block_L + 1; i < block_R; ++i) {
				if (type == 1) {
					fi[i] = (i - 1) * block_size + 1;
					ls[i] = i * block_size;

					f[i] = ls[i] - fi[i] + 1;
					val[i] = 1;
				}
				else {
					fi[i] = ls[i] = -1;
					f[i] = 0;
					val[i] = 0;
				}
			}

			if (~val[block_L]) {
				for (int i = (block_L - 1) * block_size + 1; i <= block_L * block_size; ++i) a[i] = val[block_L];
				val[block_L] = -1;
			}
			for (int i = l; i <= block_L * block_size; ++i) {
				if (type == 1) a[i] = 1;
				else a[i] = 0;
			}
			process(block_L);

			if (~val[block_R]) {
				for (int i = (block_R - 1) * block_size + 1; i <= block_R * block_size; ++i) a[i] = val[block_R];
				val[block_R] = -1;
			}
			for (int i = (block_R - 1) * block_size + 1; i <= r; ++i) {
				if (type == 1) a[i] = 1;
				else a[i] = 0;
			}
			process(block_R);
		}
	}
}

// ඞඞඞඞඞ you sus