3 条题解
-
1
202502cj14周子祥 (周子祥) LV 8 @ 2025-03-29 17:24:38
已屏蔽张子瑞
-
12025-03-29 17:24:15@
求赞
-
12025-03-29 17:23:58@
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX = 1000000 + 2;
using namespace std;
int tree[MAX * 8];
int data[MAX];
int lazy[MAX * 8];
int n, m, tot;
void check(int rt)
{
if(tree[rt] < 0)
{
printf("-1\n%d", tot);
exit(0);
}
}
void up(int rt)
{
tree[rt] = min(tree[rt << 1] , tree[rt << 1 | 1]);
check(rt);
}
void built(int l, int r, int rt)
{
if(l == r)
{
tree[rt] = data[l];
return;
}
int m = l + (r - l) / 2;
built(l, m, rt << 1);
built(m + 1, r, rt << 1 | 1);
up(rt);
}
void down(int rt, int L, int R)
{
if(lazy[rt])
{
int m = L + (R - L) / 2;lazy[rt * 2] += lazy[rt];
lazy[rt * 2 + 1] += lazy[rt];
tree[rt * 2] -= lazy[rt];
tree[rt * 2 + 1] -= lazy[rt];
lazy[rt] = 0;
}
}
void modify(int L, int R, int l, int r, int val, int rt)
{if(L >= l && R <= r)
{
tree[rt] -= val;
check(rt);
lazy[rt] += val;
return;
}
check(rt);
down(rt, L, R);
int m = L + (R - L) / 2;
if(m >= l) modify(L, m, l, r, val, rt * 2);
if(m < r) modify(m + 1, R, l, r, val, rt * 2 + 1);
up(rt);
}
void solve(int n, int m)
{
int a, b, c;
for(int i = 1; i <= m; i++)
{
tot = i;
scanf("%d %d %d", &c, &a, &b);
modify(1, n, a, b, c, 1);
}
printf("0");
return;
}
void init(int n, int m)
{for(int i = 1; i <= n; i++)
scanf("%d", &data[i]);
built(1, n, 1);
}
int main()
{
// freopen("in.txt","r", stdin);
scanf("%d %d", &n, &m);
init(n, m);
solve(n, m);
return 0;
}
- 1