#include <bits/stdc++.h> using namespace std; const int MX=300030; int n,m,q,i,j,d,pos,lim,idx,nxt,cst[MX],cen[MX],x[MX],y[MX]; long long a[MX],b[MX],c[MX],f[MX],ans[MX]; bool u[MX]; vector<int> st[MX],en[MX]; set<pair<int,int>> all; bool cmpx(int i, int j) { return x[i]>x[j]; } bool cmpy(int i, int j) { return y[i]<y[j]; } int main() { scanf("%d%d%d",&n,&m,&q); for (i=1; i<=n; i++) { scanf("%lld",&a[i]); a[i]+=a[i-1]; if (i>=m) b[i-m+1]=c[i]=max(0LL,a[i]-a[i-m]); } for (i=0; i<q; i++) { scanf("%d%d",&x[i],&y[i]); if (y[i]-x[i]+1<m) continue; st[x[i]].push_back(i); en[y[i]].push_back(i); } for (i=1; i<=n; i++) { if (cst[i]=st[i].size()) { sort(st[i].begin(),st[i].end(),cmpy); all.insert({cst[i],i}); } if (cen[i]=en[i].size()) { sort(en[i].begin(),en[i].end(),cmpx); all.insert({cen[i],-i}); } } while (!all.empty()) { auto it=all.end(); --it; d=it->first; i=it->second; all.erase(it); if (i>0) { if (cst[i]!=d) continue; lim=min(n,i+m+m-2); f[i+m-2]=j=0; idx=st[i][0]; nxt=y[idx]; for (pos=i+m-1; d>0 && pos<=lim; ++pos) { f[pos]=max(f[pos-1],c[pos]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cen[nxt],-nxt}); if (--d==0) break; } if (++j==st[i].size()) break; idx=st[i][j]; nxt=y[idx]; } } for (; d>0; ++pos) { f[pos]=max(f[pos-1],c[pos]+f[pos-m]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cen[nxt],-nxt}); if (--d==0) break; } if (++j==st[i].size()) break; idx=st[i][j]; nxt=y[idx]; } } } else { i=-i; if (cen[i]!=d) continue; lim=max(1,i-m-m+2); f[i-m+2]=j=0; idx=en[i][0]; nxt=x[idx]; for (pos=i-m+1; d>0 && pos>=lim; --pos) { f[pos]=max(f[pos+1],b[pos]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cst[nxt],nxt}); if (--d==0) break; } if (++j==en[i].size()) break; idx=en[i][j]; nxt=x[idx]; } } for (; d>0; --pos) { f[pos]=max(f[pos+1],b[pos]+f[pos+m]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cst[nxt],nxt}); if (--d==0) break; } if (++j==en[i].size()) break; idx=en[i][j]; nxt=x[idx]; } } } } for (i=0; i<q; i++) printf("%lld\n",ans[i]); return 0; }
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> using namespace std; const int MX=300030; int n,m,q,i,j,d,pos,lim,idx,nxt,cst[MX],cen[MX],x[MX],y[MX]; long long a[MX],b[MX],c[MX],f[MX],ans[MX]; bool u[MX]; vector<int> st[MX],en[MX]; set<pair<int,int>> all; bool cmpx(int i, int j) { return x[i]>x[j]; } bool cmpy(int i, int j) { return y[i]<y[j]; } int main() { scanf("%d%d%d",&n,&m,&q); for (i=1; i<=n; i++) { scanf("%lld",&a[i]); a[i]+=a[i-1]; if (i>=m) b[i-m+1]=c[i]=max(0LL,a[i]-a[i-m]); } for (i=0; i<q; i++) { scanf("%d%d",&x[i],&y[i]); if (y[i]-x[i]+1<m) continue; st[x[i]].push_back(i); en[y[i]].push_back(i); } for (i=1; i<=n; i++) { if (cst[i]=st[i].size()) { sort(st[i].begin(),st[i].end(),cmpy); all.insert({cst[i],i}); } if (cen[i]=en[i].size()) { sort(en[i].begin(),en[i].end(),cmpx); all.insert({cen[i],-i}); } } while (!all.empty()) { auto it=all.end(); --it; d=it->first; i=it->second; all.erase(it); if (i>0) { if (cst[i]!=d) continue; lim=min(n,i+m+m-2); f[i+m-2]=j=0; idx=st[i][0]; nxt=y[idx]; for (pos=i+m-1; d>0 && pos<=lim; ++pos) { f[pos]=max(f[pos-1],c[pos]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cen[nxt],-nxt}); if (--d==0) break; } if (++j==st[i].size()) break; idx=st[i][j]; nxt=y[idx]; } } for (; d>0; ++pos) { f[pos]=max(f[pos-1],c[pos]+f[pos-m]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cen[nxt],-nxt}); if (--d==0) break; } if (++j==st[i].size()) break; idx=st[i][j]; nxt=y[idx]; } } } else { i=-i; if (cen[i]!=d) continue; lim=max(1,i-m-m+2); f[i-m+2]=j=0; idx=en[i][0]; nxt=x[idx]; for (pos=i-m+1; d>0 && pos>=lim; --pos) { f[pos]=max(f[pos+1],b[pos]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cst[nxt],nxt}); if (--d==0) break; } if (++j==en[i].size()) break; idx=en[i][j]; nxt=x[idx]; } } for (; d>0; --pos) { f[pos]=max(f[pos+1],b[pos]+f[pos+m]); while (nxt==pos) { if (!u[idx]) { ans[idx]=f[pos]; u[idx]=true; all.insert({--cst[nxt],nxt}); if (--d==0) break; } if (++j==en[i].size()) break; idx=en[i][j]; nxt=x[idx]; } } } } for (i=0; i<q; i++) printf("%lld\n",ans[i]); return 0; } |