Untitled

 avatar
unknown
plain_text
a year ago
2.0 kB
5
Indexable
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
struct segTree {
    vector<ll> sg;
    int n{}, MOD = 1e9 + 7;
    explicit segTree(int _n) {
        for (n = 1; n < _n; n <<= 1);
        sg.assign(2 * n, 0);
    }
    void upd(int id, int val) {
        sg[id += n] += val;
        for (id >>= 1; id; id >>= 1) sg[id] = sg[id * 2] * sg[id * 2 + 1] % MOD;
    }
    ll get(int l, int r) {
        ll res = 1;
        for (l = l + n, r = r + n + 1; l < r; l >>= 1, r >>= 1) {
            if (l & 1) res = res * sg[l++] % MOD;
            if (r & 1) res = res * sg[--r] % MOD;
        }
        return res;
    }
};
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int tt;
    cin >> tt;
    for (int tc = 0; tc < tt; ++tc) {
        int n, q;
        cin >> n >> q;
        vector<ll> a(n), com;
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
            com.push_back(a[i]);
        }
        vector<array<int, 3>> qu(q);
        for (auto &[ty, x, y]: qu) {
            cin >> ty >> x >> y;
            if (ty == 1)
                com.push_back(y);
        }
        sort(com.begin(), com.end());
        com.erase(unique(com.begin(), com.end()), com.end());
        auto get = [&](int x) { return lower_bound(com.begin(), com.end(), x) - com.begin(); };
        int sz = com.size();
        segTree sg(sz);
        for (int i = 0; i < n; ++i) {
            a[i] = get(a[i]);
            sg.upd(a[i], 1);
        }
        for (auto &[ty, x, y]: qu) {
            if (ty == 1) {
                --x;
                sg.upd(a[x], -1);
                a[x] = get(y);
                sg.upd(a[x], 1);
            } else {
                int l = get(x), r = get(y);
                if (l >= sz || r >= sz || com[l] != x || com[r] != y || r - l != y - x)
                    cout << "0\n";
                else
                    cout << sg.get(l, r) << "\n";
            }
        }
    }
}
Editor is loading...
Leave a Comment