Advertisement
MegaVerkruzo

informatics_3328

Sep 15th, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 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. void add(int n, vector<long long>& z, int l, int r, int a, int b, int now, long long delta, vector<long long>& ad) {
  35. if (a > r || b < l) {
  36. return;
  37. }
  38. if (a <= l && b >= r) {
  39. ad[now] += delta;
  40. return;
  41. }
  42. if (l == r) {
  43. return;
  44. }
  45. int mid = (l + r) / 2;
  46. add(n, z, l, mid, a, b, now * 2, delta, ad);
  47. add(n, z, mid + 1, r, a, b, now * 2 + 1, delta, ad);
  48. z[now] = max(z[now * 2] + ad[now * 2], z[now * 2 + 1] + ad[now * 2 + 1]);
  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. vector<long long> ad(n * 2, 0);
  61. build(z, a, n, 0, n - 1, 1);
  62. int m;
  63. cin >> m;
  64. for (int i = 0; i < m; ++i) {
  65. char c;
  66. int l, r;
  67. cin >> c >> l >> r;
  68. if (c == 'm') {
  69. cout << query(z, 0, n - 1, l - 1, r - 1, 1) << " ";
  70. }
  71. else {
  72. long long delta;
  73. cin >> delta;
  74. add(n, z, 0, n - 1, l - 1, r - 1, 1, delta, ad);
  75. }
  76. }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement