Advertisement
cincout

Новый скринсейвер

May 6th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long double ld;
  4.  
  5. ld d(ld a, ld b) {
  6. if (!b)
  7. return 0;
  8. return a / b;
  9. }
  10.  
  11. struct Fenwick {
  12. vector<ld> t;
  13. int n;
  14. void init (int nn)
  15. {
  16. n = nn;
  17. t.resize(n);
  18. }
  19. ld sum (int r)
  20. {
  21. ld ret = 0;
  22. for (; r >= 0; r = (r & (r + 1)) - 1) {
  23. ret += t[r];
  24. }
  25. return ret;
  26. }
  27. void inc (int i, ld add)
  28. {
  29. for (; i < n; i = (i | (i + 1))) {
  30. t[i] += add;
  31. }
  32. }
  33. ld sum (int l, int r)
  34. {
  35. return sum(r) - sum(l - 1);
  36. }
  37. };
  38.  
  39. const int DOSZ = 1005;
  40. const int MAXS = 1e+5;
  41.  
  42. Fenwick a[6], c[6];
  43.  
  44. void add(ld cur, ld ab, int pl) {
  45. a[0].inc(cur, pl * cur);
  46. a[1].inc(cur, pl * d(1.0, ab));
  47. a[2].inc(cur, pl * d(cur, ab));
  48. a[3].inc(cur, pl * d(cur * cur, 2 * ab));
  49. a[4].inc(cur, pl * 0.5 * ab);
  50. a[5].inc(cur, pl);
  51. c[0].inc(cur + ab, pl * cur);
  52. c[1].inc(cur + ab, pl * d(1.0, ab));
  53. c[2].inc(cur + ab, pl * d(cur, ab));
  54. c[3].inc(cur + ab, pl * d(cur * cur, 2 * ab));
  55. c[4].inc(cur + ab, pl * 0.5 * ab);
  56. c[5].inc(cur + ab, pl);
  57. }
  58.  
  59. ld calc(Fenwick * a, ld hh) {
  60. return hh * a[5].sum(0, hh - 1) - (hh * hh * 1.0 / 2) * a[1].sum(0, hh - 1) + hh * a[2].sum(0, hh - 1) - a[3].sum(0, hh - 1) - a[0].sum(0, hh - 1);
  61. }
  62.  
  63. int h[MAXS];
  64.  
  65. int main() {
  66. ios::sync_with_stdio(false);
  67. cin.tie(0);
  68.  
  69. for (int i = 0; i < 6; ++i)
  70. {
  71. a[i].init(DOSZ);
  72. c[i].init(DOSZ);
  73. }
  74.  
  75. int n, m;
  76. cin >> n >> m;
  77.  
  78. for (int i = 0; i < n; ++i) {
  79. cin >> h[i];
  80. }
  81.  
  82. for (int i = 0; i + 1 < n; ++i) {
  83. int cur = min(h[i], h[i + 1]);
  84. int ab = max(h[i], h[i + 1]) - cur;
  85. add(cur, ab, 1);
  86. }
  87.  
  88. for (int i = 0; i < m; ++i) {
  89. char q;
  90. cin >> q;
  91. if (q == 'Q') {
  92. int hh;
  93. cin >> hh;
  94. ld res = a[0].sum(0, hh);
  95. res += hh * a[5].sum(hh + 1, DOSZ - 1);
  96. res += calc(a, hh);
  97. res -= calc(c, hh);
  98. res += c[4].sum(0, hh - 1);
  99. printf("%.4Lf\n", (n - 1) * hh - res);
  100. }
  101. else {
  102. int id, newh;
  103. cin >> id >> newh;
  104. if (id + 1 < n) {
  105. int cur = min(h[id], h[id + 1]);
  106. int ab = max(h[id], h[id + 1]) - cur;
  107. add(cur, ab, -1);
  108. cur = min(h[id + 1], newh);
  109. ab = max(h[id + 1], newh) - cur;
  110. add(cur, ab, 1);
  111. }
  112. if (id - 1 > -1) {
  113. int cur = min(h[id], h[id - 1]);
  114. int ab = max(h[id], h[id - 1]) - cur;
  115. add(cur, ab, -1);
  116. cur = min(h[id - 1], newh);
  117. ab = max(h[id - 1], newh) - cur;
  118. add(cur, ab, 1);
  119. }
  120. h[id] = newh;
  121. }
  122. }
  123.  
  124.  
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement