线段树做法re
查看原帖
线段树做法re
498612
Saka_Noa楼主2022/10/5 17:15
#include<bits/stdc++.h> 
using namespace std;
#define lc k << 1
#define rc k << 1 | 1
#define lcon lc , l , mid
#define rcon rc , mid + 1, r
#define Mid int mid = (l + r) >> 1
#define N 2000008
#define int long long
int n , m;
int a[N];
int tree[N << 2] , add[N << 2];
void build(int k, int l , int r) {
	if(l == r) {
		tree[k] = a[l];
		return ;
	}
	Mid;
	build(lcon) , build(rcon);
	tree[k] = min(tree[lc] , tree[rc]);
}
void Add(int k , int v) {
	tree[k] += v;
	add[v] += v;
} 
void pushdown(int k) {
	if(!add[k]) return ;
	Add(lc , add[k]);
	Add(rc , add[k]);
	add[k] = 0;
}
void modify(int k , int l ,int r , int x ,int y , int v) {
	if(x <= l && r <= y) {
		Add(k , v);
		return ;
	}
	Mid;
	pushdown(k);
	if(x <= mid) modify(lcon , x, y , v);
	if(y > mid) modify(rcon , x , y , v);
	tree[k] = min(tree[lc] , tree[rc]);	
}
signed main() {
	//freopen("classroom.in" , "r" , stdin);
	//freopen("classroom.out" , "w" , stdout);
	
	//ios::sync_with_stdio(0);
	
	cin >> n >> m;
	
	for(int i = 1;i <= n;i++) {
		cin >> a[i];
	}
	
	build(1 , 1 ,n);
	
	for(int i = 1;i <= m;i++) {
		int d , l , r;
		cin >> d >> l >> r;
		modify(1 , 1 , n , l , r , -d);
		if(tree[1] < 0) {
			cout << -1 << endl << i;
			return 0;
		}
		
	}
	
	cout << 0;
	
	return 0;
}

2022/10/5 17:15
加载中...