https://jsoi.jzhx.net/question/20220720204
我是唐
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 60005;
int seg_tree[N << 2];
int Lazy[N << 2];
int arr[N];
void push_up (int root) {
seg_tree[root] = min(seg_tree[root << 1], seg_tree[root << 1 | 1]);
}
void push_down (int root, int L, int R) {
if(Lazy[root]){
Lazy[root << 1] += Lazy [root];
Lazy[root << 1 | 1] += Lazy[root];
int mid = (L + R) >> 1;
seg_tree[root << 1] += Lazy[root] * (mid - L + 1);
seg_tree[root << 1 | 1] += Lazy[root] * (R - mid);
Lazy[root] = 0;
}
}
void build (int root, int L, int R) {
Lazy[root] = 0;
if(L == R) {
seg_tree[root] = arr[L];
return ;
}
int mid = (L + R) >> 1;
build(root << 1, L, mid);
build(root << 1 | 1, mid + 1, R);
push_up(root);
}
int query (int root, int L, int R, int LL, int RR) {
if (LL <= L && R <= RR) return seg_tree[root];
push_down(root, L, R);
int Ans = LONG_LONG_MAX;
int mid = (L + R) >> 1;
if(LL <= mid) Ans = min(Ans, query(root << 1, L, mid, LL, RR));
if(RR > mid) Ans = min(Ans, query(root << 1 | 1, mid + 1, R, LL, RR));
return Ans;
}
void update(int root, int L, int R, int LL, int RR, int val){
if (LL <= L && R <= RR) {
Lazy[root] += val;
seg_tree[root] += val * (R - L + 1);
return ;
}
push_down(root, L, R);
int mid = (L + R) >> 1;
if (LL <= mid) update(root << 1, L, mid, LL, RR, val);
if (RR > mid) update(root << 1 | 1, mid + 1, R, LL , RR, val);
push_up(root);
}
signed main()
{
int n,m, R;
scanf("%lld%lld%lld",&n,&m,&R);
for(int i=1;i<=n;++i)
{
arr[i] = m;
}
build(1,1,n);
while(R--)
{
int l, r;
cin >> l >> r;
int N;
cin >> N;
r -- ;
// cout << query(1, 1, n, l, r) << endl;
if(query(1, 1, n, l, r) >=N){
puts("YES");
update(1, 1,n, l, r, -N);
}
else puts("NO");
}
return 0;
}