Advertisement
Guest User

Untitled

a guest
Jun 19th, 2016
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.88 KB | None | 0 0
  1. /*
  2. */
  3.  
  4. #pragma comment(linker, "/STACK:16777216")
  5. #define _CRT_SECURE_NO_WARNINGS
  6.  
  7. #include <fstream>
  8. #include <iostream>
  9. #include <string>
  10. #include <complex>
  11. #include <math.h>
  12. #include <set>
  13. #include <vector>
  14. #include <map>
  15. #include <queue>
  16. #include <stdio.h>
  17. #include <stack>
  18. #include <algorithm>
  19. #include <list>
  20. #include <ctime>
  21. #include <memory.h>
  22. #include <assert.h>
  23.  
  24. #define y0 sdkfaslhagaklsldk
  25. #define y1 aasdfasdfasdf
  26. #define yn askfhwqriuperikldjk
  27. #define j1 assdgsdgasghsf
  28. #define tm sdfjahlfasfh
  29. #define lr asgasgash
  30. #define norm asdfasdgasdgsd
  31.  
  32. #define eps 1e-9
  33. #define M_PI 3.141592653589793
  34. #define bs 1000000007
  35. #define bsize 350
  36.  
  37. using namespace std;
  38.  
  39. const int INF = 1e9;
  40.  
  41. const int N = 200000;
  42.  
  43. int n, m;
  44. int ar[N];
  45. vector<int> t[N*4];
  46. vector<long long> sum[N * 4];
  47.  
  48. void build(int v, int tl, int tr)
  49. {
  50. if (tl == tr)
  51. {
  52. t[v].push_back(ar[tl]);
  53. }
  54. else
  55. {
  56. int tm = tl + tr;
  57. tm /= 2;
  58. build(v * 2, tl, tm);
  59. build(v * 2 + 1, tm + 1, tr);
  60. int ptr1 = 0;
  61. int ptr2 = 0;
  62. while (ptr1 < t[v * 2].size() || ptr2 < t[v * 2 + 1].size())
  63. {
  64. if (ptr1 == t[v * 2].size())
  65. {
  66. t[v].push_back(t[v * 2 + 1][ptr2]);
  67. ++ptr2;
  68. continue;
  69. }
  70. if (ptr2 == t[v * 2 + 1].size())
  71. {
  72. t[v].push_back(t[v * 2][ptr1]);
  73. ++ptr1;
  74. continue;
  75. }
  76. if (t[v * 2][ptr1] < t[v * 2 + 1][ptr2])
  77. {
  78. t[v].push_back(t[v * 2][ptr1]);
  79. ++ptr1;
  80. continue;
  81. }
  82. t[v].push_back(t[v * 2 + 1][ptr2]);
  83. ++ptr2;
  84. continue;
  85. }
  86. }
  87.  
  88. long long S = 0;
  89. for (int i = 0; i < t[v].size(); i++)
  90. {
  91. S += t[v][i];
  92. sum[v].push_back(S);
  93. }
  94. }
  95.  
  96. long long make_query(int v, long long val)
  97. {
  98. if (val >= t[v].back())
  99. return sum[v][t[v].size()-1];
  100. if (val<t[v][0])
  101. return 0;
  102. int cur = val;
  103. int ps = upper_bound(t[v].begin(), t[v].end(), cur) - t[v].begin();
  104. //cout << ps << " %" << sum[v][ps - 1] << endl;
  105. return sum[v][ps-1];
  106. }
  107.  
  108. long long get(int v, int tl, int tr, int l, int r, long long bound)
  109. {
  110. if (l>r)
  111. return 0;
  112. if (l == tl&&r == tr)
  113. {
  114. return make_query(v, bound);
  115. }
  116. int tm = tl + tr;
  117. tm /= 2;
  118. return get(v * 2, tl, tm, l, min(r, tm), bound) + get(v * 2 + 1, tm + 1, tr, max(tm + 1, l), r, bound);
  119. }
  120.  
  121. int main(){
  122. //freopen("fabro.in","r",stdin);
  123. //freopen("fabro.out","w",stdout);
  124. //freopen("F:/in.txt", "r", stdin);
  125. //freopen("F:/output.txt", "w", stdout);
  126. ios_base::sync_with_stdio(0);
  127. //cin.tie(0);
  128.  
  129. cin >> n >> m;
  130. for (int i = 1; i <= n; i++)
  131. {
  132. cin >> ar[i];
  133. }
  134.  
  135. build(1, 1, n);
  136. for (; m; --m)
  137. {
  138. int l, r;
  139. long long can_make;
  140. cin >> l >> r;
  141. can_make = 0;
  142. while (true)
  143. {
  144. long long new_val = get(1, 1, n, l, r, can_make + 1);
  145. //cout << new_val << endl;
  146. //cin.get();
  147. if (new_val == can_make)
  148. break;
  149. can_make = new_val;
  150. }
  151. cout << can_make + 1 << endl;
  152. }
  153.  
  154. cin.get(); cin.get();
  155. return 0;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement