#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define ll long long
using namespace std;
ll t,n,a[300010],top,lm[300010],rm[300010],fl;
pair<ll,ll> sta[300010];
struct Node{
int l,r,mid;
ll maxn,minn;
Node *lson,*rson;
}*head;
Node *build(int l,int r){
Node *p=new(Node);
p->l=l;p->r=r;p->mid=(l+r)>>1;
p->maxn=-0x7fffffff;p->minn=0x7fffffff;
p->lson=p->rson=NULL;
if(l!=r){
p->lson=build(l,p->mid);
p->rson=build(p->mid+1,r);
}
return p;
}
void chg(int pos,ll w,Node *p){
if(p->l==p->r){
p->maxn=p->minn=w;return;
}
if(pos<=p->mid){
chg(pos,w,p->lson);
}
else{
chg(pos,w,p->rson);
}
p->maxn=max(p->lson->maxn,p->rson->maxn);
p->minn=min(p->lson->minn,p->rson->minn);
}
ll query(int l,int r,Node *p){
if(l==0){
if(r==0) return 0;
return max((ll)0,query(1,r,p));
}
if(l<=p->l&&p->r<=r){
return p->maxn;
}
ll res=-0x7fffffff;
if(l<=p->mid){
res=max(res,query(l,r,p->lson));
}
if(r>p->mid){
res=max(res,query(l,r,p->rson));
}
return res;
}
ll query1(int l,int r,Node *p){
if(l==0){
if(r==0) return 0;
return min((ll)0,query1(1,r,p));
}
if(l<=p->l&&p->r<=r){
return p->minn;
}
ll res=0x7fffffff;
if(l<=p->mid){
res=min(res,query1(l,r,p->lson));
}
if(r>p->mid){
res=min(res,query1(l,r,p->rson));
}
return res;
}
signed main(){
scanf("%lld",&t);
head=build(1,300000);
while(t--){
fl=0;
scanf("%lld",&n);
top=0;
sta[0].second=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
while(top>0&&sta[top].first<=a[i]) top--;
lm[i]=sta[top].second;
top++;
sta[top].first=a[i];
sta[top].second=i;
}
top=0;
sta[0].second=n+1;
for(int i=n;i>0;i--){
while(top>0&&sta[top].first<=a[i]) top--;
rm[i]=sta[top].second;
top++;
sta[top].first=a[i];
sta[top].second=i;
}
for(int i=1;i<=n;i++){
a[i]+=a[i-1];
chg(i,a[i],head);
}
for(int i=1;i<=n;i++){
if(query(i,rm[i]-1,head)-query1(lm[i],i-1,head)>a[i]-a[i-1]){
fl=1;break;
}
}
if(fl){
puts("NO");
}
else{
puts("YES");
}
}
return 0;
}