Advertisement
MegaVerkruzo

Задача B informatics

Sep 11th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int INF = 1e9;
  8.  
  9. void build(vector<long long>& z, vector<int>& a, int& n, int l, int r, int now) {
  10. if (l > r) {
  11. return;
  12. }
  13. else if (l == r) {
  14. z[now] = a[l];
  15. return;
  16. }
  17. int mid = (l + r) / 2;
  18. build(z, a, n, l, mid, now * 2);
  19. build(z, a, n, mid + 1, r, now * 2 + 1);
  20. z[now] = max(z[now * 2], z[now * 2 + 1]);
  21. }
  22.  
  23. long long query(vector<long long>& z, int l, int r, int a, int b, int now) {
  24. if (l > r || a > r || b < l) {
  25. return -INF;
  26. }
  27. if (a <= l && b >= r) {
  28. return z[now];
  29. }
  30. int mid = (l + r) / 2;
  31. return max(query(z, l, mid, a, b, now * 2), query(z, mid + 1, r, a, b, now * 2 + 1));
  32. }
  33.  
  34. long long add(int n, vector<long long>& z, int l, int r, int a, int b, int now, long long delta) {
  35. if (a > r || b < l) {
  36. return z[now];
  37. }
  38. if (l == r) {
  39. if (a <= l && r <= b) {
  40. z[now] += delta;
  41. }
  42. return z[now];
  43. }
  44. int mid = (l + r) / 2;
  45. long long _1 = add(n, z, l, mid, a, b, now * 2, delta);
  46. long long _2 = add(n, z, mid + 1, r, a, b, now * 2 + 1, delta);
  47. z[now] = max(_1, _2);
  48. return z[now];
  49. }
  50.  
  51. int main()
  52. {
  53. int n;
  54. cin >> n;
  55. vector<int> a(n);
  56. for (int i = 0; i < n; ++i) {
  57. cin >> a[i];
  58. }
  59. vector<long long> z(n * 2, 0);
  60. build(z, a, n, 0, n - 1, 1);
  61. int m;
  62. cin >> m;
  63. for (int i = 0; i < m; ++i) {
  64. char c;
  65. int l, r;
  66. cin >> c >> l >> r;
  67. if (c == 'm') {
  68. cout << query(z, 0, n - 1, l - 1, r - 1, 1) << " ";
  69. }
  70. else {
  71. long long delta;
  72. cin >> delta;
  73. delta = add(n, z, 0, n - 1, l - 1, r - 1, 1, delta);
  74. }
  75. }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement