Pagini recente » Cod sursa (job #3154462) | Cod sursa (job #3149429) | Cod sursa (job #3149435) | Cod sursa (job #3154907) | Cod sursa (job #3148912)
// comeback baby!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n, q, 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 <= min(n, 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], min(n, idx * block_size) - last);
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
if (fopen("hotel.in", "r")) {
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
}
#ifdef LOCAL_MACHINE
if (fopen("task.in", "r")) {
freopen("task.in", "r", stdin);
freopen("task.out", "w", stdout);
}
#endif
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] = min(n, i * block_size);
f[i] = 0;
val[i] = 1;
}
else {
fi[i] = ls[i] = -1;
f[i] = min(n, i * block_size) - (i - 1) * block_size;
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);
// for (int i = 1; i <= (n - 1) / block_size + 1; ++i) cerr << f[i] << " " << fi[i] << " " << ls[i] << "\n";
// cerr << "\n";
}
}
}
// ඞඞඞඞඞ you sus