Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const long INF = -1e9;
  6.  
  7. long n, k;
  8. vector<long long> t, li, ri, a, to_push;
  9.  
  10. void _build(){
  11. for(int i = n; i <= n * 2; ++i){
  12. t[i] = a[i - n + 1];
  13. }
  14. for(int i = n - 1; i > 0; --i){
  15. t[i] = max(t[i * 2], t[i * 2 + 1]);
  16. }
  17. }
  18.  
  19. void push(int b){
  20. long long v = to_push[b];
  21. //cout << v << " " << b << endl;
  22. to_push[2 * b] += v;
  23. to_push[2 * b + 1] += v;
  24. t[2 * b] += v;
  25. t[2 * b + 1] += v;
  26. to_push[b] = 0;
  27. }
  28.  
  29. void recalc(int id) {
  30. t[id] = max(t[id * 2], t[id * 2 + 1]);
  31. }
  32.  
  33. void _set(int v, int L, int R, long long add) {
  34. //cout << li[v] << " " << ri[v] << " " << L << " " << R << endl;
  35. if (li[v] > R || ri[v] < L) {
  36. return; // Полностью не лежит. Обновление к нам не относится
  37. }
  38. if (L <= li[v] && ri[v] <= R) {
  39. to_push[v] += add;
  40. t[v] += add;
  41. return; //Полностью лежит внутри отрезка. Обновляем и прибавляем push
  42. }
  43. push(v); //Протолкнули добавление. ОБЯЗАТЕЛЬНО!
  44. _set(v * 2, L, R, add);
  45. _set(v * 2 + 1, L, R, add);
  46. recalc(v); //Пересчитали ответ. ОБЯЗАТЕЛЬНО!
  47. }
  48.  
  49.  
  50. long long _max(long v, long l, long r){
  51. //cout << v << " " << l << " " << r << " " << li[v] << " " << ri[v] << " debug" << endl;
  52. if(r < li[v] || l > ri[v]){
  53. return INF;
  54. }
  55. if(l <= li[v] && r >= ri[v]){
  56. return t[v];
  57. }
  58. push(v);
  59. return (max(_max(v * 2, l, r) , _max(v * 2 + 1, l, r)));
  60. }
  61.  
  62. int main() {
  63. freopen("rmq.in", "r", stdin);
  64. //freopen("rmq.out", "w", stdout);
  65. cin >> n >> k;
  66. long gg = n;
  67. char c;
  68. for(int i = 1; ; ){
  69. while(i < n){
  70. i <<= 1;
  71. }
  72. n = i;
  73. break;
  74. }
  75. a.resize(2 * n, INF);
  76. for(int i = 1; i <= gg; ++i){
  77. cin >> a[i];
  78. }
  79. t.resize(2 * n + 1, INF);
  80. to_push.resize(2 * n + 1, 0);
  81. li.resize(2 * n + 1, 0);
  82. ri.resize(2 * n + 1, 0);
  83. _build();
  84. for(int i = n; i < 2 * n; ++i){
  85. li[i] = i - n + 1;
  86. ri[i] = li[i];
  87. }
  88. for(int i = n - 1; i > 0; --i){
  89. li[i] = li[i * 2];
  90. ri[i] = ri[i * 2 + 1];
  91. }
  92. long l, r, add;
  93. for(int i = 0; i < k; ++i){
  94. for(int i = 0; i < 3; ++i){
  95. cin >> c;
  96. }
  97. if(c == 'x'){
  98. cin >> l >> r;
  99. cout << _max(1, l, r) << endl;
  100. }
  101. else{
  102. cin >> l >> r >> add;
  103. _set(1, l, r, add);
  104. }
  105. }
  106. //for(int i = 1; i < t.size(); ++i){
  107. // cout << t[i] << " ";
  108. //}
  109. return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement