답안 #385437

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
385437 2021-04-04T09:25:57 Z Return_0 Sterilizing Spray (JOI15_sterilizing) C++17
10 / 100
57 ms 37100 KB
#pragma GCC optimize("Ofast,unroll-loops")
// #pragma comment(linker, "/stack:200000000")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma,tune=native")

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair <ll, ll> pll;

#ifdef SINA
#define dbg(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void __f(const char* name, Arg1&& arg1) { cout << name << " : " << arg1 << std::endl; }
template <typename Arg1, typename... Args> void __f (const char* names, Arg1&& arg1, Args&&... args) {
	const char* comma = strchr(names + 1, ',');cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...); }
#define dbg2(x, j, n) cout<< #x << " : "; output((j), (n), x, 1); cout.flush();
#else
#define dbg(...) 0
#define dbg2(x, j, n) 0
#endif
#define SZ(x) ((ll)((x).size()))
#define File(s, t) freopen(s ".txt", "r", stdin); freopen(t ".txt", "w", stdout);
#define input(j, n, a) for (int _i = (j); _i < (n)+(j); _i++) cin>> a[_i];
#define output(j, n, a, t) for (int _i = (j); _i < (n)+(j); _i++) cout<< a[_i] << (((t) && _i != (n)+(j)-1)? ' ' : '\n');
#define kill(x) return cout<< (x) << endl, 0
#define cl const ll
#define fr first
#define sc second
#define lc (v << 1)
#define rc (lc | 1)
#define mid ((l + r) >> 1)
#define All(x) (x).begin(), (x).end()

cl inf = sizeof(ll) == 4 ? (1e9 + 10) : (3e18), mod = 1e9 + 7, MOD = 998244353;

template <class A,class B> ostream& operator << (ostream& out,const pair<A,B>&a){return out<<'('<<a.first<<", "<<a.second<<')';}
template <class A> ostream& operator << (ostream& out, const vector<A> &a) {
	out<< '['; for (int i = -1; ++i < int(a.size());) out<< a[i] << (i + 1 < int(a.size()) ? ", " : ""); return out<<']'; }
template <class T, typename _t = less <T> > using Tree = tree <T, null_type, _t, rb_tree_tag, tree_order_statistics_node_update>;

cl N = 1e5 + 7;

ll a [N], n, k, q, len = 1;
vector <ll> fen;

struct segtree {
	struct node {
		vector <ll> num;
		node () {}
		node (ll x) {
			num.resize(len);
			for (ll i = 0; x; i++, x /= k) num[i] = x % k;
		}
		friend node operator + (const node &x, const node &y) {
			node ret; ret.num.resize(len);
			for (ll i = 0; i < len; i++) ret.num[i] = x.num[i] + y.num[i];
			return ret;
		}
		ll conv () {
			ll ret = 0;
			for (ll i = len; i--;) ret = ret * k + num[i];
			return ret;
		}
	} n;
	ll l, r, lz;
	segtree *lt, *rt;
	inline segtree (cl &L = 1, cl &R = N - 2) : l(L), r(R), lz(0) {}

	void build () {
		if (l == r) {
			n = node(a[l]);
			return;
		}
		lt = new segtree (l, mid);
		rt = new segtree (mid + 1, r);
		lt->build();
		rt->build();
		n = lt->n + rt->n;
	}

	inline void push (cl &x) {
		for (ll i = 0; i < len - x; i++) n.num[i] = n.num[i + x];
		for (ll i = len - x; i < len; i++) n.num[i] = 0;
		lz += x;
	}
	inline void shift () { if (lz) { lt->push(lz); rt->push(lz); lz = 0;} }

	void modify (cl &pos, cl &x) {
		if (l == r) {
			n = node(x);
			return;
		}
		shift();
		if (pos <= lt->r) lt->modify(pos, x);
		else rt->modify(pos, x);
		n = lt->n + rt->n;
	}

	void upd (cl &ql, cl &qr) {
		if (r < ql || qr < l)   return;
		if (ql <= l && r <= qr) {
			push(1);
			return;
		}
		shift();
		lt->upd(ql, qr);
		rt->upd(ql, qr);
		n = lt->n + rt->n;
	}

	ll ask (cl &ql, cl &qr) {
		if (r < ql || qr < l)   return 0;
		if (ql <= l && r <= qr) return n.conv();
		shift();
		return lt->ask(ql, qr) + rt->ask(ql, qr);
	}
} seg;

int main ()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin>> n >> q >> k;
	input(1, n, a);

	if (k == 1) {
		fen.resize(N);
		for (ll j = 1; j <= n; j++) for (ll i = j; i < N; i += i & -i) fen[i] += a[j];
		for (ll t, l, r, x; q--;) {
			cin>> t >> l >> r;
			if (t == 1) {
				x = r - a[l];
				a[l] = r;
				for (; l < N; l += l & -l) fen[l] += x;
			} else if (t == 3) {
				x = 0;
				for (; r; r -= r & -r) x += fen[r];
				for (l--; l; l -= l & -l) x -= fen[l];
				cout<< x << '\n';
			}
		}
		return 0;
	}

	for (ll i = 1; i < mod; len++, i *= k);
	seg.r = n; seg.build();

	for (ll t, l, r, x; q--;) {
		cin>> t >> l >> r;
		if (t == 1) seg.modify(l, r);
		else if (t == 2) seg.upd(l, r);
		else cout<< seg.ask(l, r) << '\n';
	}

	cerr<< "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";

	return 0;
}
/*
5 10 3
1
2
8
1
3
1 2 5
2 3 5
3 2 5
2 1 4
1 3 2
3 3 5
1 2 4
2 1 2
1 1 4
3 1 5

15 10 3
25
87
32
89
24
99
57
88
10
57
65
42
66
98
13
3 9 12
1 7 15
3 2 9
2 1 14
3 10 13
1 10 6
2 14 14
1 7 96
3 14 15
3 10 12

5 2 1
1
2
3
4
5
1 3 10
3 2 3

*/

Compilation message

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:153:19: warning: unused variable 'x' [-Wunused-variable]
  153 |  for (ll t, l, r, x; q--;) {
      |                   ^
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 748 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 2284 KB Output is correct
2 Correct 37 ms 1772 KB Output is correct
3 Correct 33 ms 2284 KB Output is correct
4 Correct 42 ms 2332 KB Output is correct
5 Correct 50 ms 2348 KB Output is correct
6 Correct 49 ms 2412 KB Output is correct
7 Correct 48 ms 2448 KB Output is correct
8 Correct 47 ms 2412 KB Output is correct
9 Correct 46 ms 2412 KB Output is correct
10 Correct 47 ms 2412 KB Output is correct
11 Correct 50 ms 2412 KB Output is correct
12 Correct 45 ms 2412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 8 ms 5868 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 57 ms 37100 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -