#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
struct pyt
{
int k, nr;
};
bool por1(pyt a, pyt b)
{
if (a.k < b.k)
return true;
if (a.k > b.k)
return false;
return a.nr < b.nr;
}
bool por2(pyt a, pyt b)
{
if (a.k > b.k)
return true;
if (a.k < b.k)
return false;
return a.nr < b.nr;
}
int main()
{
ios_base::sync_with_stdio(0);
int n, k, q;
cin >> n >> k >> q;
vector<ll> a(n);
for (int i = 0; i < n; ++i)
{
cin >> a[i];
if (i != 0)
a[i] += a[i - 1];
}
vector<int> maxKon(n, -1), minPocz(n, n);
vector<int> l(q), r(q);
for (int i = 0; i < q; ++i)
{
cin >> l[i] >> r[i];
--l[i];
--r[i];
maxKon[l[i]] = max(maxKon[l[i]], r[i]);
minPocz[r[i]] = min(minPocz[r[i]], l[i]);
}
ll s1 = 0, s2 = 0;
for (int i = 0; i < n; ++i)
{
if (maxKon[i] != -1)
s1 += maxKon[i] - i;
if (minPocz[i] != n)
s2 += i - minPocz[i];
}
vector< vector<pyt> > P(n);
vector<ll> dp(n, 0);
vector<ll> odp(q);
if (s1 <= s2)
{
for (int i = 0; i < q; ++i)
P[l[i]].push_back({r[i], i});
for (int i = 0; i < n; ++i)
sort(P[i].begin(), P[i].end(), por1);
for (int i = 0; i < n; ++i)
{
if (P[i].size() == 0)
continue;
for (int j = i; j <= P[i].back().k; ++j)
{
if (j - i + 1 >= k)
{
ll sum = a[j];
if (j - k >= 0)
sum -= a[j - k];
dp[j] = sum;
if (j - k >= i)
dp[j] += dp[j - k];
dp[j] = max(dp[j], (ll) 0);
if (j != i)
dp[j] = max(dp[j], dp[j - 1]);
}
}
for (int j = 0; j < P[i].size(); ++j)
odp[P[i][j].nr] = dp[P[i][j].k];
for (int j = i; j <= P[i].back().k; ++j)
dp[j] = 0;
}
}
else
{
for (int i = 0; i < q; ++i)
P[r[i]].push_back({l[i], i});
for (int i = 0; i < n; ++i)
sort(P[i].begin(), P[i].end(), por2);
for (int i = 0; i < n; ++i)
{
if (P[i].size() == 0)
continue;
for (int j = i; j >= P[i].back().k; --j)
{
if (i - j + 1 >= k)
{
ll sum = a[j + k - 1];
if (j - 1 >= 0)
sum -= a[j - 1];
dp[j] = sum;
if (j + k <= i)
dp[j] += dp[j + k];
dp[j] = max(dp[j], (ll) 0);
if (j != i)
dp[j] = max(dp[j], dp[j + 1]);
}
}
for (int j = 0; j < P[i].size(); ++j)
odp[P[i][j].nr] = dp[P[i][j].k];
for (int j = i; j >= P[i].back().k; --j)
dp[j] = 0;
}
}
for (int i = 0; i < q; ++i)
cout << odp[i] << endl;
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 128 129 130 | #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; struct pyt { int k, nr; }; bool por1(pyt a, pyt b) { if (a.k < b.k) return true; if (a.k > b.k) return false; return a.nr < b.nr; } bool por2(pyt a, pyt b) { if (a.k > b.k) return true; if (a.k < b.k) return false; return a.nr < b.nr; } int main() { ios_base::sync_with_stdio(0); int n, k, q; cin >> n >> k >> q; vector<ll> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; if (i != 0) a[i] += a[i - 1]; } vector<int> maxKon(n, -1), minPocz(n, n); vector<int> l(q), r(q); for (int i = 0; i < q; ++i) { cin >> l[i] >> r[i]; --l[i]; --r[i]; maxKon[l[i]] = max(maxKon[l[i]], r[i]); minPocz[r[i]] = min(minPocz[r[i]], l[i]); } ll s1 = 0, s2 = 0; for (int i = 0; i < n; ++i) { if (maxKon[i] != -1) s1 += maxKon[i] - i; if (minPocz[i] != n) s2 += i - minPocz[i]; } vector< vector<pyt> > P(n); vector<ll> dp(n, 0); vector<ll> odp(q); if (s1 <= s2) { for (int i = 0; i < q; ++i) P[l[i]].push_back({r[i], i}); for (int i = 0; i < n; ++i) sort(P[i].begin(), P[i].end(), por1); for (int i = 0; i < n; ++i) { if (P[i].size() == 0) continue; for (int j = i; j <= P[i].back().k; ++j) { if (j - i + 1 >= k) { ll sum = a[j]; if (j - k >= 0) sum -= a[j - k]; dp[j] = sum; if (j - k >= i) dp[j] += dp[j - k]; dp[j] = max(dp[j], (ll) 0); if (j != i) dp[j] = max(dp[j], dp[j - 1]); } } for (int j = 0; j < P[i].size(); ++j) odp[P[i][j].nr] = dp[P[i][j].k]; for (int j = i; j <= P[i].back().k; ++j) dp[j] = 0; } } else { for (int i = 0; i < q; ++i) P[r[i]].push_back({l[i], i}); for (int i = 0; i < n; ++i) sort(P[i].begin(), P[i].end(), por2); for (int i = 0; i < n; ++i) { if (P[i].size() == 0) continue; for (int j = i; j >= P[i].back().k; --j) { if (i - j + 1 >= k) { ll sum = a[j + k - 1]; if (j - 1 >= 0) sum -= a[j - 1]; dp[j] = sum; if (j + k <= i) dp[j] += dp[j + k]; dp[j] = max(dp[j], (ll) 0); if (j != i) dp[j] = max(dp[j], dp[j + 1]); } } for (int j = 0; j < P[i].size(); ++j) odp[P[i][j].nr] = dp[P[i][j].k]; for (int j = i; j >= P[i].back().k; --j) dp[j] = 0; } } for (int i = 0; i < q; ++i) cout << odp[i] << endl; return 0; } |
English