Submission #1147191

#TimeUsernameProblemLanguageResultExecution timeMemory
1147191minggaSterilizing Spray (JOI15_sterilizing)C++20
100 / 100
299 ms10244 KiB
#include "bits/stdc++.h"

using namespace std;

#define ln "\n"
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define int long long
const int mod = 1e9 + 7;
const int inf = 2e18;
const int N = 1e5 + 7;
int n, q, k, a[N];

struct segtree {
	vector<int> st;
	int n;
	segtree() {}
	segtree(int n) : n(n) {
		st.resize(n * 4 + 1, 0);
	}
	void build(int i, int l, int r) {
		if(l == r) {
			st[i] = a[l];
			return;
		}
		int m = (l + r) >> 1;
		build(i * 2, l, m);
		build(i * 2 + 1, m + 1, r);
		st[i] = st[i * 2] + st[i * 2 + 1];
	}
	void update(int i, int l, int r, int u, int x) {
		if(l == r) {
			st[i] = x;
			return;
		}
		int m = (l + r) >> 1;
		if(u <= m) update(i * 2, l, m, u, x);
		else update(i * 2 + 1, m + 1, r, u, x);
		st[i] = st[i * 2] + st[i * 2 + 1];
	}
	int get(int i, int l, int r, int u, int v) {
		if(u > r or v < l) return 0;
		if(u <= l and r <= v) return st[i];
		int m = (l + r) >> 1;
		return get(i * 2, l, m, u, v) + get(i * 2 + 1, m + 1, r, u, v);
	}
};

signed main() {
	cin.tie(0) -> sync_with_stdio(0);
	cin >> n >> q >> k;
	set<int> s;
	for(int i = 1; i <= n; i++) cin >> a[i], s.insert(i);
	segtree st(n);
	st.build(1, 1, n);
	for(int i = 1; i <= q; i++) {
		int t, l, r; cin >> t >> l >> r;
		if(t == 1) {
			st.update(1, 1, n, l, r);
			if(a[l] > 0) s.erase(s.find(l));
			a[l] = r;
			if(a[l] > 0) s.insert(l);
		} else if(t == 2) {
			if(k == 1) continue;
			auto it = s.lower_bound(l);
			vector<int> vec;
			while(*it <= r and it != s.end()) {
				int x = *it;
				a[x] /= k;
				if(a[x] == 0) vec.pb(x);
				st.update(1, 1, n, x, a[x]);
				it++;
			}
			for(auto x : vec) s.erase(s.find(x));
		} else {
			cout << st.get(1, 1, n, l, r) << ln;
		}
	}
    cerr << "\nTime: " << clock() * 1000 / CLOCKS_PER_SEC;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...