This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;
typedef array <int, 6> nd;
const int K = 4e5 + 7, N = 1e6 + 7, ofs = (1 << 20);
int n, m, b, k;
int co[K][4], c[K];
vector <int> add[N], rem[N];
pii t[2*ofs];
nd t2[2*ofs];
inline pii Merge(pii x, pii y) {return {x.F+y.F, min(x.S, x.F+y.S)};}
inline void update(int x, int val) {
	x += ofs;
	t[x].F += val; t[x].S += val;
	while (x /= 2) t[x] = Merge(t[2*x], t[2*x+1]);
}
inline int get() {return t[1].S;}
void prop(int x) {
	t2[x][3] += t2[x][5];
	if (x < ofs) {t2[2*x][5] += t2[x][5]; t2[2*x+1][5] += t2[x][5];}
	t2[x][5] = 0;
}
inline nd Merge2(nd x, nd y) {
	if (x[3] < y[3]) return {x[0], 0, max(x[2], x[1]), x[3], x[4]+y[4], 0};
	if (x[3] > y[3]) return {0, y[1], max(y[2], y[0]), y[3], x[4]+y[4], 0};
	return {x[0]+y[0]*(x[0]==x[4]), x[1]*(y[1]==y[4])+y[1], max(max(x[2], y[2]), x[1]+y[0]), x[3], x[4]+y[4], 0};
}
inline void Update(int x, int a, int b, int val, int lo = 0, int hi = ofs-1) {
	prop(x);
	if (b < lo || hi < a) return;
	if (a <= lo && hi <= b) {
		t2[x][5] += val;
		prop(x);
		return;
	}
	int mid = (lo + hi) / 2;
	Update(2*x, a, b, val, lo, mid);
	Update(2*x+1, a, b, val, mid+1, hi);
	t2[x] = Merge2(t2[2*x], t2[2*x+1]);
}
inline int Get() {return t2[1][2]*(!t2[1][3]);}
int main () {
	FIO;
	cin >> n >> m >> b >> k;
	
	for (int i = 0; i < k; i++) {
		for (int j = 0; j < 4; j++) {
			cin >> co[i][j]; co[i][j]--;
		}
		cin >> c[i];
	}
	if (b) {
		int lo = 0, hi = min(n, m);
		while (lo < hi) {
			int mid = (lo + hi + 1) / 2;
			for (int i = 0; i < k; i++) {
				add[max(0, co[i][0]-mid+1)].pb(i);
				rem[min(co[i][2], n-mid)].pb(i);
			}
			update(m-mid+1, b+1);
			int mn = b+1;
			for (int i = 0; i <= n-mid; i++) {
				for (auto x : add[i]) {
					update(max(0, co[x][1]-mid+1), c[x]);
					update(co[x][3]+1, -c[x]);
				}
				add[i].clear();
				mn = min(mn, get());
				for (auto x : rem[i]) {
					update(max(0, co[x][1]-mid+1), -c[x]);
					update(co[x][3]+1, c[x]);
				}
				rem[i].clear();
			}
			update(m-mid+1, -b-1);
			if (mn <= b) lo = mid;
			else hi = mid-1;
		}
		
		cout << lo << "\n";
	}
	else {
		for (int i = ofs; i < 2*ofs; i++) t2[i] = {1, 1, 1, (i>=m+ofs), 1, 0};
		for (int i = ofs-1; i; i--) t2[i] = Merge2(t2[2*i], t2[2*i+1]);
		for (int i = 0; i < k; i++) {
			add[co[i][0]].pb(i);
			rem[co[i][2]].pb(i);
		}
		int mx = 0;
		for (int i = 0, j = 0; i < n; i++) {
			for (auto x : add[i]) Update(1, co[x][1], co[x][3], 1);
			while (Get() < i-j+1) {
				mx = max(mx, Get());
				for (auto x : rem[j]) Update(1, co[x][1], co[x][3], -1);
				j++;
			}
			mx = max(mx, i-j+1);
		}
		cout << mx << "\n";
	}
	return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |