Untitled
unknown
c_cpp
a year ago
2.8 kB
5
Indexable
#include <bits/stdc++.h> using namespace std; #define ll long long void FIO() { #ifndef ONLINE_JUDGE freopen("../in.txt", "r", stdin); freopen("../out.txt", "w", stdout); #endif } const int N = 1e5 + 50; const int MOD = 1e9 + 7; struct item { long long x; }; struct segTree { int size; vector<item> values; item NEUTRAL_ELEMENT = {1}; item merge(item a, item b) { return {a.x * b.x % MOD}; } void init(int n) { size = 1; while (size < n) size *= 2; values.resize(2 * size, {0}); } void set(int i, int v, int x, int lx, int rx) { if (rx - lx == 1) { values[x].x += v; return; } int m = (lx + rx) / 2; if (i < m) set(i, v, 2 * x + 1, lx, m); else set(i, v, 2 * x + 2, m, rx); values[x] = merge(values[2 * x + 1], values[2 * x + 2]); } void set(int i, int v) { set(i, v, 0, 0, size); } item calc(int l, int r, int x, int lx, int rx) { if (lx >= r || l >= rx) return NEUTRAL_ELEMENT; if (lx >= l && rx <= r) return values[x]; int m = (lx + rx) / 2; item s1 = calc(l, r, 2 * x + 1, lx, m); item s2 = calc(l, r, 2 * x + 2, m, rx); return merge(s1, s2); } item calc(int l, int r) { return calc(l, r, 0, 0, size); } }; void solve() { int n, q; cin >> n >> q; vector<int> v(n), comp; for (int &i: v) cin >> i, comp.push_back(i); vector<array<int, 3>> queries(q); for (int i = 0; i < q; ++i) { cin >> queries[i][0] >> queries[i][1] >> queries[i][2]; comp.push_back(queries[i][2]); if (queries[i][0] == 2) comp.push_back(queries[i][1]); } sort(comp.begin(), comp.end()); comp.resize(unique(comp.begin(), comp.end()) - comp.begin()); segTree st; st.init(comp.size() + 5); for (int &i: v) { i = lower_bound(comp.begin(), comp.end(), i) - comp.begin(); st.set(i, 1); } for (auto [t, x, y]: queries) { if (t == 1) { --x; st.set(v[x], -1); v[x] = lower_bound(comp.begin(), comp.end(), y) - comp.begin(); st.set(v[x], 1); } else { int l = lower_bound(comp.begin(), comp.end(), x) - comp.begin(); int r = lower_bound(comp.begin(), comp.end(), y) - comp.begin(); if (r - l != y - x) { cout << "0" << '\n'; } else { cout << st.calc(l, r + 1).x << '\n'; } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); FIO(); int t = 1; cin >> t; while (t--) { solve(); } return 0; }
Editor is loading...
Leave a Comment