Advertisement
Korotkodul

Дерево отрезков

Nov 16th, 2021 (edited)
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <set>
  5. #include <string>
  6. #include <algorithm>
  7. #include <map>
  8. using namespace std;
  9. using ll = long long;
  10. #define pii pair <int,int>
  11. void cv(vector <int> v){
  12. for (auto x: v) cout<<x<<' ';
  13. cout<<'\n';
  14. }
  15.  
  16. struct sct{
  17. int l,r,mn,mx,sum, zeros, ch1,ch2;
  18. };
  19.  
  20. void csc(sct x){
  21. cout<<"l = "<<x.l<<" r = "<<x.r<<" mn = "<<x.mn<<" mx = "<<x.mx<<" sum = "<<x.sum<<"zeros = "<<x.zeros<<" ch1 = "<<x.ch1<<" ch2 = "<<x.ch2<<'\n';
  22. }
  23.  
  24. void cinfo(sct x){
  25. cout<<x.mn<<'/'<<x.mx<<'/'<<x.sum<<'\n';
  26. }
  27.  
  28.  
  29. vector <int> ar = {0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  30.  
  31. vector <sct> tree;
  32.  
  33. /*на массиве: корень имеет номер 1
  34. Дети вершины V и имеют номера (2*V, 2*V + 1)
  35. Номер родителя в вершины U в такой вариации - (U/2)
  36.  
  37. дети отрезка [L, R] занимаются отрезками [L, M], [M + 1; R], где M = (L + R)/2
  38. */
  39.  
  40. void make(int idx, int li, int ri){
  41. sct sm; //some
  42. //cout<<"lr = "<<li<<' '<<ri<<'\n';
  43. sm.l = li;
  44. sm.r = ri;
  45. if (li == ri){
  46. sm.ch1 = -1;
  47. sm.ch2 = -1;
  48. sm.sum = ar[li];
  49. sm.mx = ar[li];
  50. sm.mn = ar[li];
  51. if (ar[li] == 0) sm.zeros = 1;
  52. else sm.zeros = 0;
  53. tree[idx] = sm;
  54. //csc(sm);
  55. //cout<<'\n';
  56. }
  57. else{
  58. int mi = (li + ri) / 2;
  59. sm.ch1 = idx * 2;
  60. sm.ch2 = idx * 2 + 1;
  61. make(idx * 2, li, mi);
  62. make(idx * 2 + 1, mi+1, ri);
  63. sm.mn = min(tree[sm.ch1].mn, tree[sm.ch2].mn);
  64. sm.mx = max(tree[sm.ch1].mx, tree[sm.ch2].mx);
  65. sm.sum = tree[sm.ch1].sum + tree[sm.ch2].sum;
  66. sm.zeros = tree[sm.ch1].zeros + tree[sm.ch2].zeros;
  67. tree[idx] = sm;
  68. }
  69. }
  70. int L = -1, R = -1;
  71. int intersct( int l, int r){
  72. if (l >= L && r <= R){
  73. return 2;
  74. }
  75. else if (l <= R && r > R){
  76. return 1;
  77. }
  78. else if (r >= L && l < L){
  79. return 1;
  80. }
  81. else return 0;
  82. }
  83. int inf = 2e9;
  84.  
  85. int get_min(sct S){
  86. int inter = intersct(S.l, S.r);
  87. //csc(S);
  88. //cout<<"inter = "<<inter<<"\n\n";
  89. if (inter == 2){
  90. return S.mn;
  91. }
  92. else if (inter == 0){
  93. return inf;
  94. }
  95. else if (inter == 1){
  96. int a = get_min(tree[S.ch1]);
  97. int b = get_min(tree[S.ch2]);
  98. return min(a,b);
  99. }
  100. }
  101.  
  102. int get_sum(sct S){
  103. int inter = intersct(S.l, S.r);
  104. //csc(S);
  105. //cout<<"inter = "<<inter<<"\n\n";
  106. if (inter == 2){
  107. return S.sum;
  108. }
  109. else if (inter == 0){
  110. return 0;
  111. }
  112. else if (inter == 1){
  113. int a = get_sum(tree[S.ch1]);
  114. int b = get_sum(tree[S.ch2]);
  115. return a + b;
  116. }
  117. }
  118.  
  119. int get_max(sct S){
  120. int inter = intersct(S.l, S.r);
  121. //csc(S);
  122. //cout<<"inter = "<<inter<<"\n\n";
  123. if (inter == 2){
  124. return S.mx;
  125. }
  126. else if (inter == 0){
  127. return -inf;
  128. }
  129. else if (inter == 1){
  130. int a = get_max(tree[S.ch1]);
  131. int b = get_max(tree[S.ch2]);
  132. return max(a,b);
  133. }
  134. }
  135.  
  136. int get_zeros(sct S){
  137. int inter = intersct(S.l, S.r);
  138. //csc(S);
  139. //cout<<"inter = "<<inter<<"\n\n";
  140. if (inter == 2){
  141. return S.zeros;
  142. }
  143. else if (inter == 0){
  144. return 0;
  145. }
  146. else if (inter == 1){
  147. int a = get_zeros(tree[S.ch1]);
  148. int b = get_zeros(tree[S.ch2]);
  149. return a + b;
  150. }
  151. }
  152.  
  153.  
  154.  
  155. int main()
  156. {
  157.  
  158. ar.clear();
  159. int N,K;
  160. cin>>N;
  161. ar.resize(N);
  162. for (int &x: ar) cin>>x;
  163. cin>>K;
  164. int lg = log(N) / log(2);
  165. if (pow(2, lg) < N) lg++;
  166. int sz = 2 * pow(2, lg);
  167. tree.resize(sz);
  168. make(1, 0, N-1);
  169.  
  170. for (int i = 0; i < K; ++i){
  171. cin>>L>>R;
  172. L--;
  173. R--;
  174. //cout<<"L = "<<L<<" R = "<<R<<'\n';
  175. cout<<get_zeros(tree[1])<<' ';
  176. }
  177. }
  178.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement