#include <iostream> #include <algorithm> using namespace std; typedef long long int LL; struct Przed { LL p, q, t; friend inline bool operator < (const Przed &a, const Przed &b) { if(a.p != b.p) return a.p < b.p; return a.q < b.q; } }; constexpr LL N = 3e5+7; LL in[N], tab[N], dp[N], mks[N], ans[N], position[N]; Przed pyt[N]; inline void cnt_dp(LL p, LL sk, LL q, LL k) { for(LL i=sk;i<=p;i++) mks[i]=0; for(LL i=p;i!=q;i++) { dp[i] = max(tab[i],(LL)0); while(position[sk+1] <= position[i]-k) sk++; if(position[i]-k >= position[sk]) dp[i] += mks[sk]; mks[i] = dp[i]; if(i && mks[i-1] > mks[i]) mks[i] = mks[i-1]; } } int main() { ios_base::sync_with_stdio(0); cin.tie(); LL n,k,q, licz0=0,licz1=0, licz2=0, sum; cin >> n >> k >> q; for(LL i=0;i!=n;i++) cin >> in[i]; for(LL i=0;i!=k;i++) tab[0] += in[i]; sum = tab[0]; if(sum > 0) licz2++; for(LL i=1;i<=n-k;i++) { sum += in[i+k-1] - in[i-1]; if(sum > 0) { tab[licz2] = sum; position[licz2++] = i; } } for(LL i=0;i!=q;i++) { LL a,b; cin >> a >> b; a--; b--; if(b-k+1 >= a) pyt[licz0++] = Przed{a,b-k+1,i}; } sort(pyt,pyt + licz0); int s1=0, s2=0; while(licz1 < licz0) { while(position[s2] < pyt[licz1].p && s2<licz2) s2++; while(position[s1 + 1] <= pyt[licz1].p - k&& s1<s2) s1++; cnt_dp(s2, s1, licz2, k); int liczk = s2; do { while(position[liczk + 1] <= pyt[licz1].q && liczk+1 < licz2) liczk++; if(position[s2] <= pyt[licz1].q) ans[pyt[licz1].t] = mks[liczk]; licz1++; }while(pyt[licz1-1].p == pyt[licz1].p); } for(LL i=0;i!=q;i++) cout<<ans[i]<<"\n"; 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 | #include <iostream> #include <algorithm> using namespace std; typedef long long int LL; struct Przed { LL p, q, t; friend inline bool operator < (const Przed &a, const Przed &b) { if(a.p != b.p) return a.p < b.p; return a.q < b.q; } }; constexpr LL N = 3e5+7; LL in[N], tab[N], dp[N], mks[N], ans[N], position[N]; Przed pyt[N]; inline void cnt_dp(LL p, LL sk, LL q, LL k) { for(LL i=sk;i<=p;i++) mks[i]=0; for(LL i=p;i!=q;i++) { dp[i] = max(tab[i],(LL)0); while(position[sk+1] <= position[i]-k) sk++; if(position[i]-k >= position[sk]) dp[i] += mks[sk]; mks[i] = dp[i]; if(i && mks[i-1] > mks[i]) mks[i] = mks[i-1]; } } int main() { ios_base::sync_with_stdio(0); cin.tie(); LL n,k,q, licz0=0,licz1=0, licz2=0, sum; cin >> n >> k >> q; for(LL i=0;i!=n;i++) cin >> in[i]; for(LL i=0;i!=k;i++) tab[0] += in[i]; sum = tab[0]; if(sum > 0) licz2++; for(LL i=1;i<=n-k;i++) { sum += in[i+k-1] - in[i-1]; if(sum > 0) { tab[licz2] = sum; position[licz2++] = i; } } for(LL i=0;i!=q;i++) { LL a,b; cin >> a >> b; a--; b--; if(b-k+1 >= a) pyt[licz0++] = Przed{a,b-k+1,i}; } sort(pyt,pyt + licz0); int s1=0, s2=0; while(licz1 < licz0) { while(position[s2] < pyt[licz1].p && s2<licz2) s2++; while(position[s1 + 1] <= pyt[licz1].p - k&& s1<s2) s1++; cnt_dp(s2, s1, licz2, k); int liczk = s2; do { while(position[liczk + 1] <= pyt[licz1].q && liczk+1 < licz2) liczk++; if(position[s2] <= pyt[licz1].q) ans[pyt[licz1].t] = mks[liczk]; licz1++; }while(pyt[licz1-1].p == pyt[licz1].p); } for(LL i=0;i!=q;i++) cout<<ans[i]<<"\n"; return 0; } |