#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=3e5+7;
ll ans[LIM], T[LIM], n, k, q;
void dc(int l, int r, vector<pair<pair<int,int>,int>>&V) {
if(l==r) {
if(T[l]>0) for(auto i : V) ans[i.nd]=T[l];
return;
}
int mid=(l+r)/2;
ll dpl[mid-l+1][k], dpr[r-mid][k];
rep(i, mid-l+1) rep(j, k) dpl[i][j]=0;
rep(i, k) {
ll ma1=0, ma2=0;
for(int j=mid-i; j>=l; --j) {
dpl[mid-j][i]=max(ma1, ma2+T[j]);
ma1=max(ma1, dpl[mid-j][i]);
if(mid-j-k+1>=0) ma2=max(ma2, dpl[mid-j-k+1][i]);
}
}
rep(i, r-mid) rep(j, k) dpr[i][j]=0;
rep(i, k) {
ll ma1=0, ma2=0;
for(int j=mid+1+i; j<=r; ++j) {
dpr[j-mid-1][i]=max(ma1, ma2+T[j]);
ma1=max(ma1, dpr[j-mid-1][i]);
if(j-mid-k>=0) ma2=max(ma2, dpr[j-mid-k][i]);
}
}
vector<pair<pair<int,int>,int>>lewo, prawo;
for(auto i : V) {
if(i.st.st<=mid && mid<i.st.nd) {
ll ma=0;
rep(j, k) {
ma=max(ma, dpr[i.st.nd-mid-1][k-j-1]);
ans[i.nd]=max(ans[i.nd], dpl[mid-i.st.st][j]+ma);
}
} else if(i.st.nd<=mid) lewo.pb(i);
else prawo.pb(i);
}
dc(l, mid, lewo);
dc(mid+1, r, prawo);
}
void malek() {
vector<pair<pair<int,int>,int>>V;
rep(i, q) {
int a, b;
cin >> a >> b; --a; --b;
b-=k-1;
if(a<=b) V.pb({{a, b}, i});
}
dc(0, n-1, V);
}
void brutnq() {
vector<pair<int,int>>pyt[n];
rep(i, q) {
int a, b;
cin >> a >> b; --a; --b;
b-=k-1;
if(a<=b) pyt[a].pb({b, i});
}
ll dp[n];
rep(i, n) {
if(!pyt[i].size()) continue;
int ma=0;
for(auto j : pyt[i]) ma=max(ma, j.st);
ll ma1=0, ma2=0;
rep(j, ma-i+1) {
dp[j]=max(ma1, ma2+T[j+i]);
ma1=max(ma1, dp[j]);
if(j-k+1>=0) ma2=max(ma2, dp[j-k+1]);
}
for(auto j : pyt[i]) ans[j.nd]=dp[j.st-i];
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> k >> q;
rep(i, n) cin >> T[i];
ll sum=0;
rep(i, k) sum+=T[i];
rep(i, n-k+1) {
sum-=T[i];
T[i]+=sum;
sum+=T[i+k];
}
n=n-k+1;
if(k<=500) malek();
else brutnq();
rep(i, q) cout << ans[i] << '\n';
}
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 | #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=3e5+7; ll ans[LIM], T[LIM], n, k, q; void dc(int l, int r, vector<pair<pair<int,int>,int>>&V) { if(l==r) { if(T[l]>0) for(auto i : V) ans[i.nd]=T[l]; return; } int mid=(l+r)/2; ll dpl[mid-l+1][k], dpr[r-mid][k]; rep(i, mid-l+1) rep(j, k) dpl[i][j]=0; rep(i, k) { ll ma1=0, ma2=0; for(int j=mid-i; j>=l; --j) { dpl[mid-j][i]=max(ma1, ma2+T[j]); ma1=max(ma1, dpl[mid-j][i]); if(mid-j-k+1>=0) ma2=max(ma2, dpl[mid-j-k+1][i]); } } rep(i, r-mid) rep(j, k) dpr[i][j]=0; rep(i, k) { ll ma1=0, ma2=0; for(int j=mid+1+i; j<=r; ++j) { dpr[j-mid-1][i]=max(ma1, ma2+T[j]); ma1=max(ma1, dpr[j-mid-1][i]); if(j-mid-k>=0) ma2=max(ma2, dpr[j-mid-k][i]); } } vector<pair<pair<int,int>,int>>lewo, prawo; for(auto i : V) { if(i.st.st<=mid && mid<i.st.nd) { ll ma=0; rep(j, k) { ma=max(ma, dpr[i.st.nd-mid-1][k-j-1]); ans[i.nd]=max(ans[i.nd], dpl[mid-i.st.st][j]+ma); } } else if(i.st.nd<=mid) lewo.pb(i); else prawo.pb(i); } dc(l, mid, lewo); dc(mid+1, r, prawo); } void malek() { vector<pair<pair<int,int>,int>>V; rep(i, q) { int a, b; cin >> a >> b; --a; --b; b-=k-1; if(a<=b) V.pb({{a, b}, i}); } dc(0, n-1, V); } void brutnq() { vector<pair<int,int>>pyt[n]; rep(i, q) { int a, b; cin >> a >> b; --a; --b; b-=k-1; if(a<=b) pyt[a].pb({b, i}); } ll dp[n]; rep(i, n) { if(!pyt[i].size()) continue; int ma=0; for(auto j : pyt[i]) ma=max(ma, j.st); ll ma1=0, ma2=0; rep(j, ma-i+1) { dp[j]=max(ma1, ma2+T[j+i]); ma1=max(ma1, dp[j]); if(j-k+1>=0) ma2=max(ma2, dp[j-k+1]); } for(auto j : pyt[i]) ans[j.nd]=dp[j.st-i]; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> q; rep(i, n) cin >> T[i]; ll sum=0; rep(i, k) sum+=T[i]; rep(i, n-k+1) { sum-=T[i]; T[i]+=sum; sum+=T[i+k]; } n=n-k+1; if(k<=500) malek(); else brutnq(); rep(i, q) cout << ans[i] << '\n'; } |
English