1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| #include <bits/stdc++.h> #define MAXN 100005 #define X 50000 #define INF 0x3f3f3f3f using namespace std; inline int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int a[MAXN],pos[MAXN],n,m; struct Query{ int l,r,id; }q[MAXN]; inline bool operator < (const Query &A,const Query &B){ return pos[A.l]==pos[B.l]?A.r<B.r:pos[A.l]<pos[B.l]; } static int Ans[MAXN]; int ans,Size; int tempMax[MAXN],tempMin[MAXN]; int Max[MAXN],Min[MAXN]; int Max1[MAXN],Min1[MAXN]; int tempsum,tempans; inline int BruteForce(int l,int r){ int s=0,ret=0; for (register int i=l;i<=r;++i) Max1[s+X]=-INF,Min1[s+X]=INF,s+=a[i]; Max1[s+X]=-INF,Min1[s+X]=INF; s=0; Max1[X]=max(Max1[X],l-1); Min1[X]=min(Min1[X],l-1); for (register int i=l;i<=r;++i){ s+=a[i]; Max1[s+X]=max(Max1[s+X],i); Min1[s+X]=min(Min1[s+X],i); ret=max(ret,Max1[s+X]-Min1[s+X]); } s=0; for (register int i=l;i<=r;++i) Max1[s+X]=-INF,Min1[s+X]=INF,s+=a[i]; Max1[s+X]=-INF,Min1[s+X]=INF; return ret; } int sum; inline int MoQueue(int i,int id){ int R=min(n,Size*id); int r=R; for (register int i=0;i<MAXN;++i) Max[i]=-INF,tempMax[i]=-INF; for (register int i=0;i<MAXN;++i) Min[i]=INF,tempMin[i]=INF; ans=0,sum=0; Max[X]=R; Min[X]=R; tempMax[X]=R+1; tempMin[X]=R+1; while (pos[q[i].l]==id){ if (pos[q[i].l]==pos[q[i].r]){ Ans[q[i].id]=BruteForce(q[i].l,q[i].r); i++; continue; } for (register int j=r+1;j<=q[i].r;++j){ sum+=a[j]; Max[sum+X]=max(Max[sum+X],j); Min[sum+X]=min(Min[sum+X],j); ans=max(ans,Max[sum+X]-Min[sum+X]); } r=q[i].r; tempans=0,tempsum=0; tempMax[X]=R+1; tempMin[X]=R+1; for (register int j=R;j>=q[i].l;--j){ tempsum+=a[j]; tempMax[tempsum+X]=max(tempMax[tempsum+X],j); tempMin[tempsum+X]=min(tempMin[tempsum+X],j); tempans=max(tempans,tempMax[tempsum+X]-tempMin[tempsum+X]); tempans=max(tempans,Max[-tempsum+X]-tempMin[tempsum+X]+1); } Ans[q[i].id]=max(tempans,ans); for (register int j=q[i].l;j<=R;++j){ tempMax[tempsum+X]=-INF; tempMin[tempsum+X]=INF; tempsum-=a[j]; } i++; } return i; } int main(){ n=read(),m=read(); Size=(int)(n/sqrt(m)); for (register int i=1;i<=n;++i){ a[i]=read(); pos[i]=(i-1)/Size+1; } for (register int i=1;i<=m;++i){ q[i].l=read(),q[i].r=read(),q[i].id=i; } sort(q+1,q+1+m); int ptr=1; for (register int i=1;i<=pos[n];++i){ ptr=MoQueue(ptr,i); } for (register int i=1;i<=m;++i){ printf("%d\n",Ans[i]); } }
|