Advertisement
a53

Median_Heaps

a53
Apr 23rd, 2022
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <deque>
  4. #include <cmath>
  5. #include <climits>
  6. #define Nmax 100001
  7. using namespace std;
  8.  
  9. int n, q, x, block, NM;
  10. int aib[Nmax];
  11. long long aibs[Nmax];
  12. int V[Nmax], S[Nmax], N[Nmax];
  13. long long Rez[Nmax];
  14.  
  15. struct Queryy {
  16. int st, dr, pos;
  17. }Q[Nmax];
  18.  
  19. inline void Update(int pos, int val1, int val2){
  20. for(int i = pos; i < Nmax; i += i & -i)
  21. aib[i] += val1,
  22. aibs[i] += val2;
  23. }
  24. inline long long Query(int pos, int c){
  25. long long sum = 0, s = 0;
  26.  
  27. for(int i = pos; i > 0; i -= i & -i)
  28. sum += aib[i],
  29. s += aibs[i];
  30.  
  31. if(c == 1)
  32. return sum;
  33. else return s;
  34. }
  35.  
  36. inline bool cmp(int a, int b){ return V[a] < V[b];}
  37.  
  38. inline bool Querys(Queryy a, Queryy b){
  39. if(a.dr / block == b.dr / block){
  40. if(a.dr / block % 2 == 0)
  41. return a.st > b.st;
  42. else return a.st < b.st;
  43. }
  44.  
  45. return a.dr / block > b.dr / block;
  46. }
  47. inline void Add(int k){ Update(N[k], 1, V[S[N[k]]]); }
  48. inline void Del(int k){ Update(N[k], -1, -V[S[N[k]]]); }
  49.  
  50. inline int Binary_Search(int pos){
  51. int st = 1, dr = n, ans = -1;
  52.  
  53. while(st <= dr){
  54. int mid = (st + dr) / 2;
  55.  
  56. int q = Query(mid, 1);
  57.  
  58. if(q >= pos)
  59. dr = mid - 1,
  60. ans = mid;
  61. else st = mid + 1;
  62. }
  63. return ans;
  64. }
  65.  
  66. int main() {
  67. ios::sync_with_stdio(0);
  68. cin.tie(0);
  69. cout.tie(0);
  70.  
  71. cin >> n;
  72.  
  73. block = sqrt(n);//!impartitm in blocuri vectorul pentru a putea raspunde mai eficient la query-uri
  74.  
  75. for(int i = 1; i <= n; ++i){
  76. cin >> V[i];
  77. S[i] = i;
  78. }
  79.  
  80. sort(S + 1, S + 1 + n, cmp); //! sortam indici in functie de V[i] pentru ca numerele sunt mari
  81.  
  82. for(int i = 1; i <= n; ++i)
  83. N[S[i]] = i; //! N[i] = al catelea numar din sir ar fi V[i] daca era sortat crescator
  84.  
  85. cin >> q;
  86.  
  87. for(int i = 1; i <= q; ++i){
  88. cin >> Q[i].st >> Q[i].dr; //!citim query-urile
  89. Q[i].pos = i;
  90. }
  91.  
  92. sort(Q + 1, Q + 1 + q, Querys); //!sortam query-urile pentru a raspunde mai eficient la ele
  93.  
  94. int st = 1, dr = 0;
  95.  
  96. for(int i = 1; i <= q; ++i){
  97. int s = Q[i].st, d = Q[i].dr;
  98.  
  99. while(st < s)
  100. Del(st++);
  101. while(st > s)
  102. Add(--st);
  103. while(dr < d)
  104. Add(++dr);
  105. while(dr > d)
  106. Del(dr--);
  107.  
  108. int poss = (d - s + 2) / 2;
  109. int ans = Binary_Search(poss);
  110. long long s1 = Query(n, 2);
  111. int h1 = Query(n, 1);
  112. long long s2 = Query(ans, 2);
  113. int h2 = Query(ans, 1);
  114. s1 = s1 - s2;
  115. h1 = h1 - h2;
  116.  
  117. Rez[Q[i].pos] = s1 - 1LL * h1 * V[S[ans]] + (-s2 + 1LL * h2 * V[S[ans]]) ;
  118. }
  119.  
  120. for(int i = 1; i <= q; ++i)
  121. cout << Rez[i] << "\n";
  122.  
  123. return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement