Advertisement
999ms

E17

Oct 23rd, 2019
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) (x).begin(),(x).end()
  3.  
  4. using namespace std;
  5.  
  6. const int MSIZE = 1e5;
  7. const int CAP = 64;
  8. int arr[MSIZE];
  9. int add[(MSIZE + CAP - 1) / CAP];
  10. map<int, int> gr[(MSIZE + CAP - 1) / CAP];
  11. int n;
  12.  
  13. void Add(int l, int r, int val) {
  14.     if (l / CAP == r / CAP) {
  15.         for (int i = l; i <= r; i++) {
  16.             auto it = gr[i / CAP].find(arr[i]);
  17.             it->second--;
  18.             if (it->second == 0) {
  19.                 gr[i / CAP].erase(it);
  20.             }
  21.             arr[i] += val;
  22.             gr[i / CAP][arr[i]]++;
  23.         }
  24.         return;
  25.     }
  26.     for (int i = l; i / CAP == l / CAP && i < n; i++) {
  27.         auto it = gr[i / CAP].find(arr[i]);
  28.         it->second--;
  29.         if (it->second == 0) {
  30.             gr[i / CAP].erase(it);
  31.         }
  32.         arr[i] += val;
  33.         gr[i / CAP][arr[i]]++;
  34.     }
  35.     for (int i = r; i / CAP == r / CAP && i >= 0; i--) {
  36.         auto it = gr[i / CAP].find(arr[i]);
  37.         it->second--;
  38.         if (it->second == 0) {
  39.             gr[i / CAP].erase(it);
  40.         }
  41.         arr[i] += val;
  42.         gr[i / CAP][arr[i]]++;
  43.     }
  44.     for (int i = l / CAP + 1; i < r / CAP; i++) {
  45.         add[i] += val;
  46.     }
  47. }
  48.  
  49. bool Contains(int l, int r, int val) {
  50.     if (l / CAP == r / CAP) {
  51.         for (int i = l; i <= r; i++) {
  52.             if (arr[i] + add[i / CAP] == val) {
  53.                 return true;
  54.             }
  55.         }
  56.         return false;
  57.     }
  58.     for (int i = l; i / CAP == l / CAP && i < n; i++) {
  59.         if (arr[i] + add[i / CAP] == val) {
  60.             return true;
  61.         }
  62.     }
  63.     for (int i = r; i / CAP == r / CAP && i >= 0; i--) {
  64.         if (arr[i] + add[i / CAP] == val) {
  65.             return true;
  66.         }
  67.     }
  68.     for (int i = l / CAP + 1; i < r / CAP; i++) {
  69.         auto it = gr[i].find(val - add[i]);
  70.         if (it != gr[i].end()) {
  71.             if (it->second > 0) {
  72.                 return true;
  73.             }
  74.         }
  75.     }
  76.     return false;
  77. }
  78.  
  79. int main() {
  80.     ios_base::sync_with_stdio(false);
  81.     cin.tie(nullptr);
  82.     int q;
  83.     cin >> n >> q;
  84.     for (int i = 0; i < n; i++) {
  85.         cin >> arr[i];
  86.         gr[i / CAP][arr[i]]++;
  87.     }
  88.     while (q--) {
  89.         char t;
  90.         int l, r, val;
  91.         cin >> t >> l >> r >> val;
  92.         l--, r--;
  93.         if (t == '+') {
  94.             Add(l, r, val);
  95.         } else {
  96.             cout << (Contains(l, r, val) ? "YES\n" : "NO\n");
  97.         }
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement