Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int L = 400;
- const int N = 100005;
- vector <int> blocks[L];
- int add[L], ar[N], n, q;
- void remake(int num)
- {
- blocks[num].clear();
- int id = num * L;
- while (id < n && id / L == num)
- blocks[num].push_back(ar[id++]);
- sort(blocks[num].begin(), blocks[num].end());
- }
- bool haveHeight(int num, int h)
- {
- int l = 0, r = blocks[num].size() - 1;
- while (l <= r) {
- int mid = (l + r) / 2;
- if (blocks[num][mid] + add[num] == h) {
- return 1;
- }
- if (blocks[num][mid] + add[num] < h) {
- l = mid + 1;
- }
- else {
- r = mid - 1;
- }
- }
- return 0;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cin >> n >> q;
- for (int i = 0; i < n; ++i) {
- cin >> ar[i];
- blocks[i / L].push_back(ar[i]);
- }
- for (int i = 0; i <= (n - 1) / L; ++i)
- sort(blocks[i].begin(), blocks[i].end());
- for (int z = 0; z < q; ++z) {
- char req;
- cin >> req;
- if (req == '+') {
- int l, r, pl;
- cin >> l >> r >> pl;
- --l, --r;
- set <int> reBuild;
- for (int i = l; i <= r; ) {
- if (i % L == 0 && i + L - 1 <= r) {
- add[i / L] += pl;
- i += L;
- }
- else {
- ar[i] += pl;
- reBuild.insert(i / L);
- i++;
- }
- }
- for (int i : reBuild)
- remake(i);
- }
- else {
- int l, r, h;
- cin >> l >> r >> h;
- --l, --r;
- bool hasFind = 0;
- for (int i = l; i <= r; ) {
- if (i % L == 0 && i + L - 1 <= r) {
- hasFind |= haveHeight(i / L, h);
- i += L;
- }
- else {
- if (add[i / L] + ar[i] == h) {
- hasFind = 1;
- }
- i++;
- }
- }
- cout << (hasFind ? "YES\n" : "NO\n");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment