Advertisement
MegaVerkruzo

Untitled

Sep 16th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 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. void push(vector<long long>& ad, int now) {
  24. ad[now * 2] += ad[now];
  25. ad[now * 2 + 1] += ad[now];
  26. ad[now] = 0;
  27. }
  28.  
  29. long long query(vector<long long>& z, int l, int r, int a, int b, int now, vector<long long>& ad) {
  30. if (l > r || a > r || b < l) {
  31. return -INF;
  32. }
  33. if (a <= l && b >= r) {
  34. return z[now] + ad[now];
  35. }
  36. push(ad, now);
  37. int mid = (l + r) / 2;
  38. return max(query(z, l, mid, a, b, now * 2, ad) + ad[now * 2], query(z, mid + 1, r, a, b, now * 2 + 1, ad) + ad[now * 2]);
  39. }
  40.  
  41. 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) {
  42. if (a > r || b < l || l > r) {
  43. return;
  44. }
  45. if (a <= l && b >= r) {
  46. ad[now] += delta;
  47. return;
  48. }
  49. push(ad, now);
  50. int mid = (l + r) / 2;
  51. add(n, z, l, mid, a, b, now * 2, delta, ad);
  52. add(n, z, mid + 1, r, a, b, now * 2 + 1, delta, ad);
  53. z[now] = max(z[now * 2] + ad[now * 2], z[now * 2 + 1] + ad[now * 2 + 1]);
  54. }
  55.  
  56. int main()
  57. {
  58. int n;
  59. cin >> n;
  60. vector<int> a(n);
  61. for (int i = 0; i < n; ++i) {
  62. cin >> a[i];
  63. }
  64. vector<long long> z(n * 2, 0);
  65. vector<long long> ad(n * 2, 0);
  66. build(z, a, n, 0, n - 1, 1);
  67. int m;
  68. cin >> m;
  69. for (int i = 0; i < m; ++i) {
  70. char c;
  71. int l, r;
  72. cin >> c >> l >> r;
  73. if (c == 'm') {
  74. cout << query(z, 0, n - 1, l - 1, r - 1, 1, ad) << " ";
  75. }
  76. else {
  77. long long delta;
  78. cin >> delta;
  79. add(n, z, 0, n - 1, l - 1, r - 1, 1, delta, ad);
  80. }
  81. }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement