Submission #647642

#TimeUsernameProblemLanguageResultExecution timeMemory
647642ymmSterilizing Spray (JOI15_sterilizing)C++17
100 / 100
249 ms5332 KiB
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

const int N = 100'010;
ll seg[N<<2];
int n, q, k;

void spray(int l, int r, int k, int i, int b, int e)
{
	if (r <= b || e <= l)
		return;
	if (k == 1 || seg[i] == 0)
		return;
	if (e-b == 1) {
		seg[i] /= k;
		return;
	}
	spray(l,r,k,2*i+1,b,(b+e)/2);
	spray(l,r,k,2*i+2,(b+e)/2,e);
	seg[i] = seg[2*i+1] + seg[2*i+2];
}

void set_to(int p, ll x, int i, int b, int e)
{
	if (e-b == 1) {
		seg[i] = x;
		return;
	}
	if (p < (b+e)/2)
		set_to(p, x, 2*i+1, b, (b+e)/2);
	else
		set_to(p, x, 2*i+2, (b+e)/2, e);
	seg[i] = seg[2*i+1] + seg[2*i+2];
}

ll get(int l, int r, int i, int b, int e)
{
	if (l <= b && e <= r)
		return seg[i];
	if (r <= b || e <= l)
		return 0;
	return get(l,r,2*i+1,b,(b+e)/2) + get(l,r,2*i+2,(b+e)/2,e);
}

int main()
{
	cin.tie(0) -> sync_with_stdio(false);
	cin >> n >> q >> k;
	Loop (i,0,n) {
		int x;
		cin >> x;
		set_to(i, x, 0, 0, n);
	}
	while (q--) {
		int t, x, y;
		cin >> t >> x >> y;
		if (t == 1)
			set_to(x-1, y, 0, 0, n);
		if (t == 2)
			spray(x-1, y, k, 0, 0, n);
		if (t == 3)
			cout << get(x-1, y, 0, 0, n) << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...