#include <algorithm>
#include <iostream>
#include <set>
#include <vector>
using namespace std;
const int MaxN = 2e6 + 3;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
inline void write(long long x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
struct Node {
int v, b, x;
};
Node p[MaxN << 1];
vector<pair<int, int> > h[MaxN][2], s[MaxN][2];
pair<int, int> zh[MaxN], zs[MaxN];
set<pair<int, int> > se;
long long ans[MaxN];
inline bool cmp(const Node &x, const Node &y) {
return x.v > y.v;
}
signed main() {
int n, m, q, k, tot = 0, dh = 0, ds = 0;
n = read();
m = read();
k = read();
q = read();
for (int i = 1; i <= q; i++) {
int op, l, r, c, t;
op = read();
l = read();
r = read();
c = read();
t = read();
// cout << op << ' ' << l << ' ' << r << ' ' << c << ' ' << t << '\n';
if (op == 1) {
if (t == 1) {
h[l][1].push_back({q + i, c});
h[r + 1][0].push_back({q + i, c});
} else {
h[l][1].push_back({q - i + 1, c});
h[r + 1][0].push_back({q - i + 1, c});
}
} else {
if (t == 1) {
s[l][1].push_back({q + i, c});
s[r + 1][0].push_back({q + i, c});
} else {
s[l][1].push_back({q - i + 1, c});
s[r + 1][0].push_back({q - i + 1, c});
}
}
}
for (int i = 1; i <= n; i++) {
zh[i] = {-1, 0};
}
for (int i = 1; i <= m; i++) {
zs[i] = {-1, 0};
}
for (int i = 1; i <= n + 1; i++) {
for (auto ll : h[i][1]) {
se.insert(ll);
}
for (auto ll : h[i][0]) {
se.erase(ll);
}
if (se.size() >= 1) {
auto it = se.end();
it--;
zh[i] = (*it);
}
}
for (int i = 1; i <= m + 1; i++) {
for (auto ll : s[i][1]) {
se.insert(ll);
}
for (auto ll : s[i][0]) {
se.erase(ll);
}
if (se.size() >= 1) {
auto it = se.end();
it--;
zs[i] = (*it);
}
}
for (int i = 1; i <= n; i++) {
p[++tot] = {zh[i].first, 1, zh[i].second};
}
for (int i = 1; i <= m; i++) {
p[++tot] = {zs[i].first, 0, zs[i].second};
}
sort(p + 1, p + tot + 1, cmp);
for (int i = 1; i <= tot; i++) {
if (p[i].b) {
ds++;
ans[p[i].x] += m - dh;
} else {
dh++;
ans[p[i].x] += n - ds;
}
}
for (int i = 1; i <= k; i++) {
write(ans[i]);
putchar(' ');
}
return 0;
}
实测卡在 vector 了
90 分,能优化或者思路就是错的。