Advertisement
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 all(x) x.begin(), x.end()
- const ll INF = 2e18;
- const ll mod = 1000000007;
- const ll maxn = 1e5 + 5;
- template <typename node, typename update>
- struct segTree {
- ll len;
- vector<node> t;
- vector<update> u;
- vector<bool> lazy;
- vector<ll> tl, tr;
- node identity_element;
- update identity_transformation;
- template<typename T>
- segTree(T &a) {
- len = a.size();
- t.resize(4 * len);
- u.resize(4 * len);
- lazy.resize(4 * len);
- tl.resize(4 * len);
- tr.resize(4 * len);
- identity_element = node();
- identity_transformation = update();
- build(a, 1, 0, len - 1);
- }
- template <typename T>
- void build(const T &a, const ll &v, const ll &l, const ll &r) {
- tl[v] = l;
- tr[v] = r;
- if (l == r) {
- t[v] = a[l];
- return;
- }
- ll tm = (l + r) >> 1;
- build(a, v << 1, l, tm);
- build(a, v << 1 | 1, tm + 1, r);
- t[v].merge(t[v << 1], t[v << 1 | 1]);
- }
- void apply(const ll &v, update val) {
- if (tl[v] != tr[v]) {
- lazy[v] = 1;
- u[v].combine(val, tl[v], tr[v]);
- }
- val.apply(t[v], tl[v], tr[v]);
- }
- void pushdown(const ll &v) {
- if (lazy[v]) {
- apply(v << 1, u[v]);
- apply(v << 1 | 1, u[v]);
- u[v] = identity_transformation;
- lazy[v] = 0;
- }
- }
- void rupd(const ll &v, const ll &l, const ll &r, update val) {
- if (l > tr[v] || r < tl[v])
- return;
- if (tl[v] >= l && tr[v] <= r) {
- apply(v, val);
- return;
- }
- pushdown(v);
- rupd(v << 1, l, r, val);
- rupd(v << 1 | 1, l, r, val);
- t[v].merge(t[v << 1], t[v << 1 | 1]);
- }
- node query(const ll &v, const ll &l, const ll &r) {
- if (l > tr[v] || r < tl[v])
- return identity_element;
- if (tl[v] >= l && tr[v] <= r)
- return t[v];
- pushdown(v);
- node a, b, ans;
- a = query(v * 2, l, r);
- b = query(v * 2 + 1, l, r);
- ans.merge(a, b);
- return ans;
- }
- node query(const ll &l, const ll &r) {
- return query(1, l, r);
- }
- void rupd(const ll &l, const ll &r, update upd) {
- rupd(1, l, r, upd);
- }
- };
- struct node1 {
- ll sum = 0;
- map<ll, ll> mp;
- node1() {}
- node1(ll val) {
- sum = val;
- mp[val]++;
- }
- void merge(const node1 &l, const node1 &r) {
- sum = l.sum + r.sum;
- for (auto &i : l.mp) {
- mp[i.first] += i.second;
- }
- for (auto &j : r.mp) {
- mp[j.first] += j.second;
- }
- }
- bool check(ll x) {
- return false;
- }
- };
- struct update1 {
- ll v = 0;
- update1() {}
- update1(ll val) {
- v = val;
- }
- void combine(update1 &other, const ll &tl, const ll &tr) {
- }
- void apply(node1 &x, const ll &tl, const ll &tr) {
- x.mp[x.sum]--;
- if (x.mp[x.sum] == 0) x.mp.erase(x.sum);
- x.sum = v;
- x.mp[x.sum]++;
- }
- };
- void solve() {
- ll n;
- cin >> n;
- ll q;
- cin >> q;
- vector<ll> a(n + 5);
- for (ll i = 1; i <= n; i++) cin >> a[i];
- segTree<node1, update1> st(a);
- while (q--) {
- ll t;
- cin >> t;
- if (t == 1) {
- ll i, v;
- cin >> i >> v;
- st.rupd(i, i, v);
- } else {
- ll l, r;
- cin >> l >> r;
- auto mp = st.query(l, r).mp;
- ll ans = 0;
- for (auto &i : mp) {
- ans += (i.second & 1);
- }
- cout << ans << ' ';
- }
- }
- }
- signed main() {
- ios_base::sync_with_stdio(false), cin.tie(nullptr);
- int t;
- cin >> t;
- for (int i = 1; i <= t; i++) {
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement