线段树没调出来 WA * 34
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 50;
int h, w, n, ans[N];
struct node {
int x, y1, y2, id;
node() {}
node(int X, int Y1, int Y2, int Id) {x = X, y1 = Y1, y2 = Y2, id = Id;}
friend bool operator < (const node &x, const node &y) {
return x.x > y.x;
}
} a[N];
struct tree {
int v, tag;
} t[4 * N];
void pushdown(int k) {
if (!t[k].tag) return;
t[k + k].v += t[k].tag;
t[k + k].tag += t[k].tag;
t[k + k + 1].v += t[k].tag;
t[k + k].tag += t[k].tag;
t[k].tag = 0;
}
void pushup(int k) {
t[k].v = max(t[k + k].v, t[k + k + 1].v);
}
void buildtree(int k, int l, int r) {
if (l == r) {
t[k].v = 0;
t[k].tag = 0;
return;
}
int m = (l + r) / 2;
buildtree(k + k, l, m);
buildtree(k + k + 1, m + 1, r);
}
void insert(int k, int l, int r, int x, int y, int z) {
//cerr << "ok2" << endl;
if (l == x && r == y) {
t[k].v += z;
t[k].tag += z;
return;
}
pushdown(k);
int m = (l + r) / 2;
if (y <= m) insert(k + k, l, m, x, y, z);
else if (x > m) insert(k + k + 1, m + 1, r, x, y, z);
else insert(k + k, l, m, x, m, z), insert(k + k + 1, m + 1, r, m + 1, y, z);
pushup(k);
}
int calc(int k, int l, int r, int x, int y) {
//cerr << "ok1" << endl;
if (l == x && r == y) return t[k].v;
pushdown(k);
int m = (l + r) / 2, ans = 0;
if (y <= m) ans = calc(k + k, l, m, x, y);
else if (x > m) ans = calc(k + k + 1, m + 1, r, x, y);
else ans = max(calc(k + k, l, m, x, m), calc(k + k + 1, m + 1, r, m + 1, y));
pushup(k);
return ans;
}
int main() {
scanf("%d%d%d", &h, &w, &n);
for (int i = 1; i <= n; i++) {
int x, y, l;
scanf("%d%d%d", &x, &y, &l);
a[i] = node(x, y, y + l - 1, i);
}
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) {
int d = calc(1, 1, w, a[i].y1, a[i].y2);
ans[a[i].id] = h - d;
insert(1, 1, w, a[i].y1, a[i].y2, 1);
}
for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
return 0;
}