fork download
  1. // ~~ icebear ~~
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7. typedef pair<int, ii> iii;
  8.  
  9. template<class T>
  10. bool minimize(T &a, const T &b) {
  11. if (a > b) return a = b, true;
  12. return false;
  13. }
  14.  
  15. template<class T>
  16. bool maximize(T &a, const T &b) {
  17. if (a < b) return a = b, true;
  18. return false;
  19. }
  20.  
  21. #define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
  22. #define FORR(i,a,b) for(int i=(a); i>=(b); --i)
  23. #define REP(i, n) for(int i=0; i<(n); ++i)
  24. #define RED(i, n) for(int i=(n)-1; i>=0; --i)
  25. #define MASK(i) (1LL << (i))
  26. #define BIT(S, i) (((S) >> (i)) & 1)
  27. #define mp make_pair
  28. #define pb push_back
  29. #define fi first
  30. #define se second
  31. #define all(x) x.begin(), x.end()
  32. #define task "gen"
  33.  
  34. const int MOD = 1e9 + 7;
  35. const int inf = 1e9 + 27092008;
  36. const ll INF = 1e18 + 27092008;
  37. const int N = 1e5 + 5;
  38. int n, q, m, a[N], pref[N][30], dp[35], nxt[35];
  39.  
  40. void init(void) {
  41. cin >> n >> m >> q;
  42. FOR(i, 1, n) {
  43. cin >> a[i];
  44. a[i] %= m;
  45. REP(j, m) pref[i][j] = pref[i - 1][j];
  46. pref[i][a[i]]++;
  47. }
  48. }
  49.  
  50. void process(void) {
  51. while(q--) {
  52. int l, r, k;
  53. cin >> l >> r >> k;
  54. vector<ii> bags;
  55. REP(j, m) {
  56. int num = pref[r][j] - pref[l - 1][j];
  57. int cur = 0;
  58. while(MASK(cur) <= num) {
  59. bags.emplace_back(MASK(cur) * j % m, MASK(cur));
  60. num -= MASK(cur);
  61. cur++;
  62. }
  63. if (num > 0) bags.emplace_back(num * j % m, num);
  64. }
  65.  
  66. // for(auto &x : bags) cerr << x.fi << ' ' << x.se << '\n';
  67.  
  68. memset(dp, 0, sizeof dp);
  69. REP(i, (int)bags.size()) {
  70. memset(nxt, 0, sizeof nxt);
  71. REP(j, m) if (dp[j]) {
  72. maximize(nxt[j], dp[j]);
  73. maximize(nxt[(j + bags[i].fi) % m], dp[j] + bags[i].se);
  74. }
  75. maximize(nxt[bags[i].fi], bags[i].se);
  76. REP(j, m) dp[j] = nxt[j];
  77. }
  78. cout << dp[k] << '\n';
  79. // cerr << dp[k] << '\n';
  80. }
  81. }
  82.  
  83. int main() {
  84. ios_base::sync_with_stdio(0);
  85. cin.tie(0); cout.tie(0);
  86. if (fopen(task".inp", "r")) {
  87. freopen(task".inp", "r", stdin);
  88. freopen(task".out", "w", stdout);
  89. }
  90. int tc = 1;
  91. // cin >> tc;
  92. while(tc--) {
  93. init();
  94. process();
  95. }
  96. return 0;
  97. }
  98.  
  99.  
Success #stdin #stdout 0s 5324KB
stdin
Standard input is empty
stdout
Standard output is empty