Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define _test int _TEST; cin>>_TEST; while(_TEST--)
- class SegTree
- {
- public:
- const int N = 1000005;
- int n;
- ll int *__;
- ll int ___ = 0;
- SegTree()
- {__ = new ll int[N];}
- void init(vector<int> &d, int n)
- {this->n = n; c(d);}
- void c(vector<int> &d)
- {
- for (int i = 0; i < n; ++i) __[n+i]=d[i];
- for (int i = n - 1; i > 0; --i) __[i] = __[i<<1] + __[i<<1|1];
- }
- void ___ult(int l, int r)
- {
- for (l += n, r += n; l < r; l >>= 1, r >>= 1)
- {
- if (l&1)___ = ___ + __[l++];
- if (r&1)___ = ___ + __[--r];
- }
- }
- ll int getSum(int l, int r)
- {
- ___ = 0; ___ult(l, r);
- return ___;
- }
- void update(int p, ll int _)
- {
- for(__[p += n] = _; p > 1; p >>= 1)
- {
- __[p>>1] = (__[p] + __[p^1]);
- }
- }
- };
- int main()
- {
- SegTree sgt;
- _test
- {
- int n, q;
- cin >> n >> q;
- set<int> s;
- vector<int> a(n+1);
- for (int i = 1; i <= n; i++)
- {
- cin >> a[i];
- if (a[i] == 1)
- s.insert(i);
- }
- sgt.init(a, n+1);
- while (q--)
- {
- int t;
- cin >> t;
- if (t == 2)
- {
- int i, v;
- cin >> i >> v;
- if (a[i] == 1)
- s.erase(i);
- a[i] = v;
- if (a[i] == 1)
- s.insert(i);
- sgt.update(i, v);
- }
- else
- {
- int v;
- cin >> v;
- int sum = sgt.getSum(1, n+1);
- int d = sum - v;
- if (v > sum)
- {
- cout << "NO" << endl;
- continue;
- }
- if (d % 2 == 0)
- {
- cout << "YES" << endl;
- continue;
- }
- ll int mx = 0;
- if (s.size())
- {
- int f = *s.begin(), l = *(--s.end());
- mx = max(mx, sgt.getSum(f+1, n+1));
- mx = max(mx, sgt.getSum(1, l));
- }
- if (v <= mx)
- cout << "YES" << endl;
- else
- cout << "NO" << endl;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment