Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. struct Node{
  5.     long long keymax, keymin, l, r, add;
  6. };
  7. vector <Node> tree(1e6);
  8. vector <long long> a(1e6);
  9. long long inf = 1e18;
  10. void build(long long ind, long long l, long long r){
  11.     tree[ind].l = l;
  12.     tree[ind].r = r;
  13.     if (r - l == 1){
  14.         tree[ind].add = 0;
  15.         tree[ind].keymax = a[l];
  16.         tree[ind].keymin = a[l];
  17.         return;
  18.     }
  19.     long long m = (l + r) / 2;
  20.     build(2 * ind, l, m);
  21.     build(2 * ind + 1, m, r);
  22.     tree[ind].keymax = max(tree[2 * ind].keymax, tree[2 * ind + 1].keymax);
  23.     tree[ind].keymin = min(tree[2 * ind].keymin, tree[2 * ind + 1].keymin);
  24. }
  25. void modify(int ind, int x){
  26.     tree[ind].keymax = x;
  27.     tree[ind].keymin = x;
  28.     tree[ind].add = x;
  29. }
  30. void push(long long ind){
  31.     if (tree[ind].add == 0) return;
  32.     else if (tree[ind].r - tree[ind].l > 1) {
  33.         modify(2 * ind, tree[ind].add);
  34.         modify(2 * ind + 1, tree[ind].add);
  35.         tree[ind].add = 0;
  36.     }
  37. }
  38. void update(long long ind, long long l, long long r, long long add){
  39.     push(ind);
  40.     if (l <= tree[ind].l && tree[ind].r <= r){
  41.         modify(ind, add);
  42.         return;
  43.     }
  44.     else if(l >= tree[ind].r || r <= tree[ind].l){
  45.         return;
  46.     }
  47.     update(2 * ind, l, r, add);
  48.     update(2 * ind + 1, l, r, add);
  49.     tree[ind].keymax = max(tree[2 * ind].keymax, tree[2 * ind + 1].keymax);
  50.     tree[ind].keymin = min(tree[2 * ind].keymin, tree[2 * ind + 1].keymin);
  51. }
  52. long long searchmax(long long ind, long long l, long long r){
  53.     push(ind);
  54.     if (l <= tree[ind].l && tree[ind].r <= r){
  55.         return tree[ind].keymax;
  56.     }
  57.     else if(tree[ind].l >= r || tree[ind].r <= l){
  58.         return -inf;
  59.     }
  60.     else{
  61.         return max(searchmax(2 * ind, l, r), searchmax(2 * ind + 1, l, r));
  62.     }
  63. }
  64. long long searchmin(long long ind, long long l, long long r){
  65.     push(ind);
  66.     if (l <= tree[ind].l && tree[ind].r <= r){
  67.         return tree[ind].keymin;
  68.     }
  69.     else if(tree[ind].l >= r || tree[ind].r <= l){
  70.         return inf;
  71.     }
  72.     else{
  73.         return min(searchmin(2 * ind, l, r), searchmin(2 * ind + 1, l, r));
  74.     }
  75. }
  76. int main() {
  77.     long long n, m, q, l, r, c, b;
  78.     cin >> n >> m >> q;
  79.     char s;
  80.     for (long long i = 1; i < n + 1; i++){
  81.         cin >> a[i];
  82.     }
  83.     build(1, 1, n + 1);
  84.     for (long long i = 0; i < q; i++){
  85.         cin >> b >> c >> l >> r;
  86.         if (searchmax(1, l, r + 1) == searchmin(1, l, r + 1) && searchmin(1, l, r + 1) == b) {
  87.             update(1, l, r + 1, c);
  88.             cout << 1 << '\n';
  89.         } else {
  90.             cout << 0 << '\n';
  91.         }
  92.     }
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement