plz help
#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 2e5 + 5;
const long long INF = 0x3f3f3f3f;
long long n;
long long a[MAXN];
long long lbound[MAXN];
long long rbound[MAXN];
long long prefix[MAXN];
long long st1[MAXN][25];
long long st2[MAXN][25];
long long st3[MAXN][25];
stack <long long> stk1;
stack <long long> stk2;
void initst() {
for (long long i = 1; i <= n; i++) {
st1[i][0] = prefix[i];
st2[i][0] = prefix[i];
st3[i][0] = a[i];
}
for(long long j = 1; j <= 20; j++) {
for (long long i = 1; i + (1 << j) - 1 <= n; i++) {
st1[i][j] = max(st1[i][j - 1], st1[i + (1 << (j - 1))][j - 1]);
st2[i][j] = min(st2[i][j - 1], st2[i + (1 << (j - 1))][j - 1]);
st3[i][j] = max(st3[i][j - 1], st3[i + (1 << (j - 1))][j - 1]);
}
}
}
void initinterval() {
for (long long i = 1; i <= n; i++) {
lbound[i] = 0;
rbound[i] = n + 1;
}
for (long long i = 1; i <= n; i++) {
while (!stk1.empty() && a[i] > a[stk1.top()]) {
rbound[stk1.top()] = i;
stk1.pop();
}
stk1.push(i);
}
for (long long i = n; i >= 1; i--) {
while (!stk2.empty() && a[i] > a[stk2.top()]) {
lbound[stk2.top()] = i;
stk2.pop();
}
stk2.push(i);
}
}
long long querymax(long long l, long long r) {
long long k = log2(r - l + 1);
return max(st1[l][k], st1[r - (1 << k) + 1][k]);
}
long long querymin(long long l, long long r) {
long long k = log2(r - l + 1);
return min(st2[l][k], st2[r - (1 << k) + 1][k]);
}
long long query(long long l, long long r) {
long long k = log2(r - l + 1);
return max(st3[l][k], st3[r - (1 << k) + 1][k]);
}
int main() {
long long t;
cin >> t;
while (t--) {
cin >> n;
memset(st1, 0, sizeof(st1));
memset(st2, 0, sizeof(st2));
memset(a, 0, sizeof(a));
memset(prefix, 0, sizeof(prefix));
while (!stk1.empty()) {
stk1.pop();
}
while (!stk2.empty()) {
stk2.pop();
}
for (long long i = 1; i <= n; i++) {
cin >> a[i];
prefix[i] = a[i] + prefix[i - 1];
//cout << prefix[i] << " ";
}
//cout << endl;
initinterval();
initst();
bool ok = true;
for (long long i = 1; i <= n; i++) {
long long leftsum = querymin(lbound[i], i - 1);
//cout << "lsum: " << lbound[i] << " " << i - 1 << " " << leftsum << endl;
long long rightsum = querymax(i, rbound[i] - 1);
//cout << "rsum: " << i << " " << rbound[i] << " " << rightsum << endl;
//cout << "a[i]: " << a[i] << endl;
//long long maxnum = query(lbound[i], rbound[i]);
long long summax = rightsum - leftsum;
if (a[i] < summax) {
ok = false;
break;
}
}
if (!ok) {
cout << "NO" << endl;
}
else {
cout << "YES" << endl;
}
}
return 0;
}