#pragma GCC optimize ("Ofast")
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define FOR(i, a, b) for (auto i=(a); i<(b); i++)
#define FORD(i, a, b) for (int i=(a); i>(b); i--)
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
#define PPC(x) __builtin_popcountll(x)
#define MSB(x) (63 - __builtin_clzll(x))
#define LSB(x) __builtin_ctz(x)
#define ARG(x, i) (get<i>(x))
#define ithBit(m, i) ((m) >> (i) & 1)
#define pb push_back
#define ft first
#define sd second
#define kw(a) ((a) * (a))
#ifdef DEBUG
#include "debug.h"
#else
#define dbg(...) 0
#endif
using namespace std;
template <typename T1, typename T2> inline void remin(T1& a, T2 b) { a = min(a, (T1)b); }
template <typename T1, typename T2> inline void remax(T1& a, T2 b) { a = max(a, (T1)b); }
using Ky = vector <int>;
const int maxN = 1 << 19;
const long long INF = 1'0000'0000'0000'0000;
long long Left[maxN], Right[maxN], prefL[maxN], prefR[maxN];
int k;
void calc(long long dp[maxN], int* T, int n, int x, long long pref[maxN])
{
int s = min(x, n+1);
FOR(i, 0, s)
dp[i] = -INF;
s = min(k, n+1);
FOR(i, x, s)
dp[i] = pref[x];
FOR(i, k, n+1)
dp[i] = max(dp[i-1], dp[i-k] + pref[i]-pref[i-k]);
}
pair <int, int> Q[maxN];
long long res[maxN];
void go(int* T, int n, vector <int>& qs)
{
if (qs.empty() or n <= k)
return;
int n1 = n/2, n2 = n - n1, *T2 = T + n1;
vector <int> l, r, mid;
for (int i : qs)
{
auto [a, b] = Q[i];
if (b <= n1)
l.pb(i);
else if (a > n1)
{
Q[i] = {a - n1, b - n1};
r.pb(i);
}
else
{
Q[i] = {n1 - a + 1 , b - n1};
mid.pb(i);
}
}
#define SPLIT(x, y) \
{ \
calc(Left, T, n1, x, prefL); calc(Right, T2, n2, y, prefR); \
for (int i : mid) remax(res[i], Left[Q[i].ft] + Right[Q[i].sd]); \
}
reverse(T+1, T+n1+1);
FOR(i, 1, n1+1) prefL[i] = prefL[i-1] + T[i];
FOR(i, 1, n2+1) prefR[i] = prefR[i-1] + T2[i];
SPLIT(0, 0);
FOR(j, 1, k)
SPLIT(j, k-j);
reverse(T+1, T+n1+1);
go(T, n1, l);
go(T2, n2, r);
}
int T[maxN];
void solve()
{
int n, q;
scanf ("%d%d%d", &n, &k, &q);
FOR(i, 1, n+1)
scanf ("%d", T+i), prefR[i] = prefR[i-1] + T[i];
FOR(i, 0, q)
{
int a, b;
scanf ("%d%d", &a, &b);
if ((b-a+1) % k == 0)
remax(res[i], prefR[b] - prefR[a-1]);
Q[i] = {a, b};
}
vector <int> qs(q);
iota(ALL(qs), 0);
go(T, n, qs);
FOR(i, 0, q)
printf("%lld\n", res[i]);
}
int main()
{
int t = 1;
//scanf ("%d", &t);
FOR(tid, 1, t+1)
{
//printf("Case #%d: ", tid);
solve();
}
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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #pragma GCC optimize ("Ofast") #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define FOR(i, a, b) for (auto i=(a); i<(b); i++) #define FORD(i, a, b) for (int i=(a); i>(b); i--) #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(), (x).end() #define PPC(x) __builtin_popcountll(x) #define MSB(x) (63 - __builtin_clzll(x)) #define LSB(x) __builtin_ctz(x) #define ARG(x, i) (get<i>(x)) #define ithBit(m, i) ((m) >> (i) & 1) #define pb push_back #define ft first #define sd second #define kw(a) ((a) * (a)) #ifdef DEBUG #include "debug.h" #else #define dbg(...) 0 #endif using namespace std; template <typename T1, typename T2> inline void remin(T1& a, T2 b) { a = min(a, (T1)b); } template <typename T1, typename T2> inline void remax(T1& a, T2 b) { a = max(a, (T1)b); } using Ky = vector <int>; const int maxN = 1 << 19; const long long INF = 1'0000'0000'0000'0000; long long Left[maxN], Right[maxN], prefL[maxN], prefR[maxN]; int k; void calc(long long dp[maxN], int* T, int n, int x, long long pref[maxN]) { int s = min(x, n+1); FOR(i, 0, s) dp[i] = -INF; s = min(k, n+1); FOR(i, x, s) dp[i] = pref[x]; FOR(i, k, n+1) dp[i] = max(dp[i-1], dp[i-k] + pref[i]-pref[i-k]); } pair <int, int> Q[maxN]; long long res[maxN]; void go(int* T, int n, vector <int>& qs) { if (qs.empty() or n <= k) return; int n1 = n/2, n2 = n - n1, *T2 = T + n1; vector <int> l, r, mid; for (int i : qs) { auto [a, b] = Q[i]; if (b <= n1) l.pb(i); else if (a > n1) { Q[i] = {a - n1, b - n1}; r.pb(i); } else { Q[i] = {n1 - a + 1 , b - n1}; mid.pb(i); } } #define SPLIT(x, y) \ { \ calc(Left, T, n1, x, prefL); calc(Right, T2, n2, y, prefR); \ for (int i : mid) remax(res[i], Left[Q[i].ft] + Right[Q[i].sd]); \ } reverse(T+1, T+n1+1); FOR(i, 1, n1+1) prefL[i] = prefL[i-1] + T[i]; FOR(i, 1, n2+1) prefR[i] = prefR[i-1] + T2[i]; SPLIT(0, 0); FOR(j, 1, k) SPLIT(j, k-j); reverse(T+1, T+n1+1); go(T, n1, l); go(T2, n2, r); } int T[maxN]; void solve() { int n, q; scanf ("%d%d%d", &n, &k, &q); FOR(i, 1, n+1) scanf ("%d", T+i), prefR[i] = prefR[i-1] + T[i]; FOR(i, 0, q) { int a, b; scanf ("%d%d", &a, &b); if ((b-a+1) % k == 0) remax(res[i], prefR[b] - prefR[a-1]); Q[i] = {a, b}; } vector <int> qs(q); iota(ALL(qs), 0); go(T, n, qs); FOR(i, 0, q) printf("%lld\n", res[i]); } int main() { int t = 1; //scanf ("%d", &t); FOR(tid, 1, t+1) { //printf("Case #%d: ", tid); solve(); } return 0; } |
English