Guest User

Untitled

a guest
Oct 31st, 2024
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. typedef long long ll;
  7. typedef vector<int> vi;
  8. typedef pair<int,int> pii;
  9. typedef pair<double, double> pdd;
  10. #define pb push_back
  11. #define mp make_pair
  12. #define fs first
  13. #define sc second
  14. #define rep(i, from, to) for (int i = from; i < (to); ++i)
  15. #define all(x) x.begin(), x.end()
  16. #define sz(x) (int)(x).size()
  17. #define FOR(i, to) for (int i = 0; i < (to); ++i)
  18. typedef vector<vector<int> > vvi;
  19. typedef vector<ll> vll;
  20. typedef vector<vll> vvll;
  21. typedef vector<pair<int, int> > vpi;
  22. typedef pair<ll,ll> pll;
  23. typedef vector<string> vs;
  24. const char en = '\n';
  25. vi v;
  26. int N,Q;
  27. int X;
  28. vi POS;
  29. vi getPos(int x) {
  30. int last = sz(v)-1;
  31. vi ret(sz(v));
  32. for (int i=0;i<sz(v);++i) {
  33. while(last >= 0 && v[last] + v[i] > x) {
  34. --last;
  35. }
  36. ret[i] = last + i;
  37. }
  38.  
  39. return ret;
  40. }
  41.  
  42. int canExtend(int l, int r, deque<pii> &dq) {
  43. if (r+1 == l) {
  44. return v[l] <= X;
  45. }
  46. if (r == sz(v)-1) return 0;
  47. if ((r-l+1) % 2 == 0) {
  48. return v[r+1] <= X;
  49. }
  50. // l gets matched with r + 1
  51. int mid = (l + r) / 2;
  52. //cout << mid << endl;
  53. //cout << sz(dq) << endl;
  54. //cout << l << " " << r << " " << sz(dq) << " " << POS[mid] << " " << (r+1 + l) << endl;
  55. if (sz(dq)) {
  56. //cout << dq.front().fs << " " << dq.front().sc << endl;
  57. }
  58. // POS[l] >= r+1 - l
  59. //
  60. if ( (sz(dq) == 0 || dq.front().fs >= (r + 1 + l)) && POS[mid] >= (r+1 + l)) {
  61. //cout << "!" << endl;
  62. return 1;
  63. }
  64. return 0;
  65. }
  66.  
  67. ll make(ll val) {
  68. POS = getPos(val);
  69. int right = 0;
  70. deque<pii> dq;
  71. ll curSum = v[0];
  72. ll ret = 0;
  73. for (int i=0;i<sz(v);++i) {
  74. if (i) curSum -= v[i-1];
  75. if (dq.front().sc < i) {
  76. dq.pop_front();
  77. }
  78. if ( (right - i+1)%2 == 0) {
  79. curSum -= v[right];
  80. --right;
  81. }
  82. //cout << i << " " << right << "START" << endl;
  83. while (canExtend(i, right, dq)) {
  84. ++right;
  85. curSum += v[right];
  86. if ( (right-i + 1) % 2 == 0) {
  87. int newVal = (i + right) / 2;
  88. while(sz(dq) != 0 && dq.back().fs >= POS[newVal]) {
  89. dq.pop_back();
  90. }
  91. dq.push_back({POS[newVal], newVal});
  92. }
  93. }
  94. if (right < i) break;
  95. // i, right is good
  96. ret += curSum - v[i] * (right - i + 1);
  97. //cout << i << " FINAL " << right << endl;
  98. }
  99. return ret;
  100. }
  101.  
  102. int main() {
  103. cin >> N >> Q;
  104. FOR(i, N) {
  105. int x;
  106. cin >> x;
  107. v.pb(x);
  108. }
  109. FOR(i, Q) {
  110. int q; cin >> q;
  111. X = q;
  112. cout << make(q) << "\n";
  113. }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment