这是一个关于线段树板子的问题。
是之前一个问题的后续。
我现在修改后还是不能实现想要的效果。请问哪里错了呢?
这个问题中 dalao @wql_cai 的 hack 数据我还是过不了。求调,感谢!
#include <bits/stdc++.h>
#define int long long
#define ls p << 1
#define rs p << 1 | 1
using namespace std;
const int N = 1e6+10;
int n, m, a[N], d, x, y, t[N*4];
void build(int p, int l, int r) {
if(l == r) t[p] = a[l];
else {
int mid = (l + r) / 2;
build(ls, l, mid);
build(rs, mid + 1, r);
t[p] = min(t[ls], t[rs]);
}
}
void modify(int p, int l, int r, int x, int y, int k) {
if(x <= l && r <= y) t[p] += k;
else {
int mid = (l + r) / 2;
if(x <= mid) modify(ls, l, mid, x, y, k);
if(y > mid) modify(rs, mid + 1, r, x, y, k);
t[p] = min(t[ls], t[rs]);
}
}
int find(int p, int l, int r, int x, int y) {
if(x <= l && r <= y) return t[p];
int mid = (l + r) / 2, mi = 1e18;
if(x <= mid) mi = min(mi, find(ls, l, mid, x, y));
if(y > mid) mi = min(mi, find(rs, mid + 1, r, x, y));
return mi;
}
signed main() {
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
build(1, 1, n);
for(int i = 1; i <= m; i++) {
scanf("%lld%lld%lld", &d, &x, &y);
modify(1, 1, n, x, y, -d);
if(find(1, 1, n, x, y) < 0) {
printf("-1\n%lld\n", i);
return 0;
}
}
printf("0\n");
return 0;
}