看题解区里面都是带log的做法,赛时想出来了一个O(n)的,但是死活调不出来,求调,或者谢谢大佬帮忙指出思路中的谬误
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 200005
using namespace std;
int n,m,a[N],val[N],nx[N],r1,nr,ans[N],pre[N];//val第x个正数的管辖长度
struct que{
int l,r,si;
}q[N];
void del(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
bool cmp(que a,que b){
return a.r<b.r;
}
int main(){
del();
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=n,la=0,v=0;i>=1;i--)
if(a[i]>0){
v=a[i];
la=i;
val[la]=1;
nx[i]=i;
}
else{
if(v+a[i]>0){
v+=a[i];
val[la]++;
}
nx[i]=la;
}
for(int i=1;i<=n;i++)pre[i]=pre[i-1]+val[i];
for(int i=1;i<=m;i++){
cin>>q[i].l>>q[i].r;
q[i].si=i;
}
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;i++){
while(r1<q[i].r){
r1++;
if(a[r1]>0)nr=r1;
}
int ll=nx[q[i].l];
if(nr>=ll&&ll)ans[q[i].si]=pre[nr]-pre[ll]+min(val[ll],ll-q[i].l+1);
else ans[q[i].si]=0;
}
for(int i=1;i<=m;i++)cout<<ans[i]<<endl;
return 0;
}