线段树代码应该没错,但样例过不了,提交RE,大佬们帮忙看看,谢谢
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+100;
typedef long long ll;
int n, m, a[N];
ll minx[N << 2];
inline void push_up(int k)
{
minx[k] = min(minx[k << 1], minx[k << 1 | 1]);
}
void build(int k, int l, int r)
{
if(l == r)
{
minx[k] = a[l] - a[l - 1];//差分
return;
}
register int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
push_up(k);
return;
}
void modify(int k, int l, int r, int p, ll v)
{
if(l == r)
{
minx[k] += v;
return;
}
register int mid = (l + r) >> 1;
if(p <= mid) modify(k << 1, l, mid, p, v);
else modify(k << 1 | 1, mid + 1, r, p, v);
push_up(k);
return;
}
ll query(int k, int l, int r, int x, int y)
{
if(x <= l && r <= y)
return minx[k];
ll ans = 1ll << 60;
int mid = (l + r) >> 1;
if(x <= mid) ans = min(ans, query(k << 1, 1, mid, x, y));
if(mid < y) ans = min(ans, query(k << 1 | 1, mid + 1, r, x, y));
return ans;
}
int main()
{
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 opt, l, r, v;
cin >> opt;
if(opt == 1)
{
cin >> l >> r >> v;
modify(1, 1, n, l, v);
modify(1, 1, n, r + 1, -v);
//差分
}
else
{
cin >> l >> r;
if(query(1, 1, n, l + 1, r) >= 0)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}