rt.
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int l[N], r[N], x[N];
int n, q;
struct S {
int l, r, x;
} a[N], tmp[N];
struct node {
int l, r;
int sum, add;
} tr[N * 4];
void pushup(node &u, node &l, node &r) { u.sum = l.sum + r.sum; }
void pushup(int u) { pushup(tr[u], tr[u * 2], tr[u * 2 + 1]); }
void build(int u, int l, int r) {
if (l == r) {
tr[u] = {l, r, 0, 0};
} else {
tr[u] = {l, r, 0, 0};
int mid = (l + r) / 2;
build(u * 2, l, mid);
build(u * 2 + 1, mid + 1, r);
pushup(u);
}
}
void pushdown(int x) {
node &u = tr[x], &l = tr[x * 2], &r = tr[x * 2 + 1];
if (u.add) {
l.add = u.add;
r.add = u.add;
l.sum = (l.r - l.l + 1) * u.add;
r.sum = (r.r - r.l + 1) * u.add;
u.add = 0;
}
}
void modify(int u, int l, int r, int x) {
if (tr[u].l >= l && tr[u].r <= r) {
tr[u].sum = (r - l + 1) * x;
tr[u].add = x;
} else {
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
if (mid >= l) {
modify(u * 2, l, r, x);
}
if (mid < r) {
modify(u * 2 + 1, l, r, x);
}
pushup(u);
}
}
int query(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) {
return tr[u].sum;
} else {
pushdown(u);
int mid = (tr[u].l + tr[u].r) / 2;
int ans = INT_MAX;
if (mid >= l) {
ans += query(u * 2, l, r);
}
if (mid < r) {
ans += query(u * 2 + 1, l, r);
}
return ans;
}
}
int comp(S a, S b) {
if (a.x != b.x) {
return a.x > b.x;
} else {
return a.l < b.l;
}
}
bool check(int x) {
for (int i = 1; i <= x; i++) {
tmp[i] = a[i];
}
sort(tmp + 1, tmp + x + 1, comp);
for (int i = 1; i <= x;) {
int j = i;
while (j <= x && tmp[j].x == tmp[i].x) {
j++;
}
int ul, nl, ur, nr;
ul = nl = tmp[i].l, ur = nr = tmp[i].r;
for (int k = i + 1; k < j; k++) {
ul = min(tmp[k].l, ul);
ur = max(tmp[k].r, ur);
nl = max(tmp[k].l, nl);
nr = min(tmp[k].r, nr);
}
if (nl > nr) {
return false;
}
if (query(1, nl, nr) == nr - nl + 1) {
return false;
}
modify(1, ul, ur, 1);
i = j;
}
return true;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= q; i++) {
cin >> a[i].l >> a[i].r >> a[i].x;
}
build(1, 1, n);
// cout << check(3) << "\n";
int l = 1, r = q + 1;
while (l < r) {
int mid = (l + r) / 2;
if (check(mid)) {
l = mid + 1;
} else {
r = mid;
}
}
cout << (r == q + 1 ? 0 : r) << "\n";
return 0;
}
目前过不了样例/kk