Advertisement
Guest User

Untitled

a guest
Mar 27th, 2015
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 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. typedef long long ll;
  20. typedef long double ld;
  21. const ll INF = 1e9 + 9;
  22.  
  23. vector<ll> tree;
  24. vector<bool> isSet;
  25. int N;
  26. void init(int n){
  27.     tree.assign(n * 4,0);
  28.     isSet.assign(n * 4, true);
  29.     N = n;
  30. }
  31.  
  32. void push(int v){
  33.     tree[v * 2] = tree[v * 2 + 1] = tree[v];
  34.     tree[v] = 0;
  35.     isSet[v * 2] = isSet[v * 2 + 1] = true;
  36.     isSet[v] = false;
  37. }
  38.  
  39. void set_tree(int v, ll val, int tl, int tr, int l, int r){
  40.     if (l > r)
  41.         return;
  42.     if (l == tl && r == tr){
  43.         tree[v] = val;
  44.         isSet[v] = true;
  45.     }
  46.     else{
  47.         if (isSet[v])
  48.             push(v);
  49.         int tm = (tl + tr) >> 1;
  50.         set_tree(v * 2, val, tl, tm, l, min(r, tm));
  51.         set_tree(v * 2 + 1, val, tm+1, tr, max(l,tm+1), r);
  52.         tree[v] = max(tree[v * 2], tree[v * 2 + 1]);
  53.     }
  54. }
  55.  
  56. void add_tree(int v, ll val, int tl, int tr, int l, int r){
  57.     if (l > r)
  58.         return;
  59.     if (l == tl && r == tr){
  60.         tree[v] += val;
  61.     }
  62.     else{
  63.         if (isSet[v])
  64.             push(v);
  65.         int tm = (tl + tr) >> 1;
  66.         add_tree(v * 2, val, tl, tm, l, min(r, tm));
  67.         add_tree(v * 2 + 1, val, tm + 1, tr, max(l, tm + 1), r);
  68.         tree[v] = max(tree[v * 2], tree[v * 2 + 1]);
  69.     }
  70. }
  71.  
  72. void relax_tree(int v, ll val, int tl, int tr, int l, int r){
  73.     if (l > r)
  74.         return;
  75.     if (l == tl && r == tr){
  76.         tree[v] = max(tree[v], val);
  77.     }
  78.     else{
  79.         if (isSet[v])
  80.             push(v);
  81.         int tm = (tl + tr) >> 1;
  82.         relax_tree(v * 2, val, tl, tm, l, min(r, tm));
  83.         relax_tree(v * 2 + 1, val, tm + 1, tr, max(l, tm + 1), r);
  84.         tree[v] = max(tree[v * 2], tree[v * 2 + 1]);
  85.     }
  86. }
  87.  
  88. ll query_tree(int v, int tl, int tr, int l, int r){
  89.     if (l > r)
  90.         return 0;
  91.     if (l == tl && r == tr){
  92.         return tree[v];
  93.     }
  94.     else{
  95.         if (isSet[v]){
  96.             return tree[v];
  97.         }
  98.         int tm = (tl + tr) >> 1;
  99.         ll a = query_tree(v * 2, tl, tm, l, min(r, tm));
  100.         ll b = query_tree(v * 2 + 1, tm+1, tr, max(tm + 1, l), r);
  101.         return max(a, b);
  102.     }
  103. }
  104.  
  105. int main(){
  106.     freopen("input.txt", "r", stdin);
  107.     freopen("output.txt", "w", stdout);
  108.  
  109.     int n, m;
  110.     cin >> n >> m;
  111.     init(n);
  112.  
  113.     for (int i = 0; i < m; i++){
  114.         string type;
  115.         cin >> type;
  116.         if (type == "set"){
  117.             int ind;
  118.             ll val;
  119.             cin >> ind >> val;
  120.             set_tree(1, val, 0, N - 1, ind, ind);
  121.         }
  122.         else if (type == "segmentset"){
  123.             int l, r;
  124.             ll val;
  125.             cin >> l >> r >> val;
  126.             set_tree(1, val, 0, N - 1, l, r - 1);
  127.         }
  128.         else if (type == "segmentadd"){
  129.             int l, r;
  130.             ll val;
  131.             cin >> l >> r >> val;
  132.             add_tree(1, val, 0, N - 1, l, r - 1);
  133.         }
  134.         else if (type == "segmentrelax"){
  135.             int l, r;
  136.             ll val;
  137.             cin >> l >> r >> val;
  138.             relax_tree(1, val, 0, N - 1, l, r - 1);
  139.         }
  140.         else if (type == "get"){
  141.             int ind;
  142.             cin >> ind;
  143.             cout << query_tree(1, 0, N - 1, ind, ind) << endl;
  144.         }
  145.         else if (type == "segmentmax"){
  146.             int l, r;
  147.             cin >> l >> r;
  148.             cout << query_tree(1, 0, N - 1, l, r - 1) << endl;
  149.         }
  150.     }
  151.  
  152.     return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement