Advertisement
Guest User

Untitled

a guest
Mar 30th, 2015
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.21 KB | None | 0 0
  1. #pragma warning (disable : 4996)
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <string>
  7. #include <set>
  8. #include <map>
  9. #include <cassert>
  10. #include <ctime>
  11. #include <iomanip>
  12. #include <queue>
  13.  
  14. using namespace std;
  15. #define sz size()
  16. #define all(x) x.begin(),x.end()
  17. #define forn(i,n) for (int i = 0; i<int(n); i++)
  18. #define mp make_pair
  19. #define sqr(x) ((x)*(x))
  20. typedef long long ll;
  21. typedef long double ld;
  22. const ll INF = 1e9 + 9;
  23.  
  24. struct Node{
  25.     ll val, add, relax;
  26.     bool s;
  27.     Node(){
  28.         val = 0; add = 0; relax = 0; s = true;
  29.     }
  30.     Node(ll val, ll add, ll relax, bool s){
  31.         this->val = val;
  32.         this->add = add;
  33.         this->relax = relax;
  34.         this->s = s;
  35.     }
  36. };
  37. vector<Node> tree;
  38. int N;
  39. void init(int n){
  40.     N = n;
  41.     tree.assign(n * 4, Node());
  42. }
  43.  
  44. ll getVal(int v){
  45.     return max(tree[v].val + tree[v].add, tree[v].relax);
  46. }
  47. void push_all(int v){
  48.     tree[v * 2].val = tree[v * 2 + 1].val = tree[v].val;
  49.     tree[v * 2].add = tree[v * 2 + 1].add = tree[v].add;
  50.     tree[v * 2].relax = tree[v * 2 + 1].relax = tree[v].relax;
  51.     tree[v * 2].s = tree[v * 2 + 1].s = true;
  52.     tree[v].s = false;
  53.     tree[v].val = 0;
  54.     tree[v].add = 0;
  55.     tree[v].relax = 0;
  56. }
  57.  
  58. void push_add(int v){
  59.     tree[v * 2].add += tree[v].add;
  60.     tree[v * 2 + 1].add += tree[v].add;
  61.     tree[v * 2].relax += tree[v].add;
  62.     tree[v * 2 + 1].relax += tree[v].add;
  63.     tree[v].add = 0;
  64. }
  65.  
  66. void push_relax(int v){
  67.     tree[v * 2].relax = max(tree[v * 2].relax, tree[v].relax);
  68.     tree[v * 2 + 1].relax = max(tree[v * 2 + 1].relax, tree[v].relax);
  69.     tree[v].relax = 0;
  70. }
  71.  
  72. //максимизируем в конце...
  73. void set_tree(int v, ll val, int tl, int tr, int l, int r){
  74.     if (l > r)
  75.         return;
  76.     if (l == tl && r == tr){
  77.         tree[v].s = true;
  78.         tree[v].add = tree[v].relax = 0;
  79.         tree[v].val = val;
  80.     }
  81.     else{
  82.         if (tree[v].s)
  83.             push_all(v);
  84.         push_add(v);
  85.         push_relax(v);
  86.         int tm = (tl + tr) >> 1;
  87.         set_tree(v * 2, val, tl, tm, l, min(r, tm));
  88.         set_tree(v * 2 + 1, val, tm + 1, tr, max(l, tm + 1), r);
  89.         tree[v].val = max(getVal(v * 2), getVal(v * 2 + 1));
  90.     }
  91. }
  92.  
  93. void add_tree(int v, ll val, int tl, int tr, int l, int r){
  94.     if (l > r)
  95.         return;
  96.     if (l == tl && r == tr){
  97.         tree[v].add += val;
  98.         tree[v].relax += val;
  99.     }
  100.     else{
  101.         if (tree[v].s)
  102.             push_all(v);
  103.         int tm = (tl + tr) >> 1;
  104.         add_tree(v * 2, val, tl, tm, l, min(r, tm));
  105.         add_tree(v * 2 + 1, val, tm + 1, tr, max(l, tm + 1), r);
  106.         tree[v].val = max(getVal(v * 2), getVal(v * 2 + 1));
  107.     }
  108. }
  109.  
  110. void relax_tree(int v, ll val, int tl, int tr, int l, int r){
  111.     if (l > r)
  112.         return;
  113.     if (l == tl && r == tr){
  114.         tree[v].relax = max(tree[v].relax, val);
  115.     }
  116.     else{
  117.         if (tree[v].s)
  118.             push_all(v);
  119.         push_add(v);
  120.         int tm = (tl + tr) >> 1;
  121.         relax_tree(v * 2, val, tl, tm, l, min(r, tm));
  122.         relax_tree(v * 2 + 1, val, tm + 1, tr, max(l, tm + 1), r);
  123.         tree[v].val = max(getVal(v * 2), getVal(v * 2 + 1));
  124.     }
  125. }
  126.  
  127. ll query_tree(int v, int tl, int tr, int l, int r){
  128.     if (l > r)
  129.         return 0;
  130.     if (l == tl && r == tr){
  131.         return getVal(v);
  132.     }
  133.     else{
  134.         if (tree[v].s)
  135.             return getVal(v);
  136.         int tm = (tl + tr) >> 1;
  137.         ll a = query_tree(v * 2, tl, tm, l, min(r, tm));
  138.         ll b = query_tree(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
  139.         return max(tree[v].add+max(a, b), tree[v].relax);
  140.     }
  141. }
  142.  
  143. int main(){
  144.     freopen("input.txt", "r", stdin);
  145.     freopen("output.txt", "w", stdout);
  146.  
  147.     int n, m;
  148.     cin >> n >> m;
  149.     init(n);
  150.  
  151.     for (int i = 0; i < m; i++){
  152.         string type;
  153.         cin >> type;
  154.         if (type == "set"){
  155.             int ind;
  156.             ll val;
  157.             cin >> ind >> val;
  158.             set_tree(1, val, 0, N - 1, ind, ind);
  159.         }
  160.         else if (type == "segmentset"){
  161.             int l, r;
  162.             ll val;
  163.             cin >> l >> r >> val;
  164.             set_tree(1, val, 0, N - 1, l, r - 1);
  165.         }
  166.         else if (type == "segmentadd"){
  167.             int l, r;
  168.             ll val;
  169.             cin >> l >> r >> val;
  170.             add_tree(1, val, 0, N - 1, l, r - 1);
  171.         }
  172.         else if (type == "segmentrelax"){
  173.             int l, r;
  174.             ll val;
  175.             cin >> l >> r >> val;
  176.             relax_tree(1, val, 0, N - 1, l, r - 1);
  177.         }
  178.         else if (type == "get"){
  179.             int ind;
  180.             cin >> ind;
  181.             cout << query_tree(1, 0, N - 1, ind, ind) << endl;
  182.         }
  183.         else if (type == "segmentmax"){
  184.             int l, r;
  185.             cin >> l >> r;
  186.             cout << query_tree(1, 0, N - 1, l, r - 1) << endl;
  187.         }
  188.     }
  189.  
  190.     return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement