#include <bits/stdc++.h> #include <iostream> using namespace std; using ll = long long; constexpr int tree_size = (1 << 19); constexpr int MAXK = 32, MAXN=3e5+10; int r = 1, n, k, q; // ll tree[2*tree_size][2][MAXK]; ll pref[MAXN]; ll dp[MAXN]; // void build_tree(int st, int en, int v=1) // { // if (en - st + 1 < k) { // return; // } // if (st == en) { // tree[v][0][0] = tree[v][1][0] = max(0LL, pref[st] - pref[st-1]); // return; // } // build_tree(st, (st+en)/2, 2*v); // build_tree((st+en)/2+1, en, 2*v+1); // for(int i=; i >=0; i--) // { // } // } int main() { ios_base::sync_with_stdio(false); cin >> n >> k >> q; for (int i=1; i <= n; i++) { int x; cin >> x; pref[i] = pref[i-1] + x; } // while(r <= n) // { // r *= 2; // } for (int i=0; i < q; i++) { int a, b; cin >> a >> b; for (int j=a-1; j <= min(a + k, b); j++) { dp[j] = 0; } for (int j=a + k - 1; j <= b; j++) { dp[j] = max(dp[j-1], dp[j-k] + pref[j] - pref[j-k]); } cout << dp[b] << "\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 | #include <bits/stdc++.h> #include <iostream> using namespace std; using ll = long long; constexpr int tree_size = (1 << 19); constexpr int MAXK = 32, MAXN=3e5+10; int r = 1, n, k, q; // ll tree[2*tree_size][2][MAXK]; ll pref[MAXN]; ll dp[MAXN]; // void build_tree(int st, int en, int v=1) // { // if (en - st + 1 < k) { // return; // } // if (st == en) { // tree[v][0][0] = tree[v][1][0] = max(0LL, pref[st] - pref[st-1]); // return; // } // build_tree(st, (st+en)/2, 2*v); // build_tree((st+en)/2+1, en, 2*v+1); // for(int i=; i >=0; i--) // { // } // } int main() { ios_base::sync_with_stdio(false); cin >> n >> k >> q; for (int i=1; i <= n; i++) { int x; cin >> x; pref[i] = pref[i-1] + x; } // while(r <= n) // { // r *= 2; // } for (int i=0; i < q; i++) { int a, b; cin >> a >> b; for (int j=a-1; j <= min(a + k, b); j++) { dp[j] = 0; } for (int j=a + k - 1; j <= b; j++) { dp[j] = max(dp[j-1], dp[j-k] + pref[j] - pref[j-k]); } cout << dp[b] << "\n"; } } |