답안 #385436

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
385436 2021-04-04T09:25:22 Z Return_0 Sterilizing Spray (JOI15_sterilizing) C++17
10 / 100
56 ms 37580 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 620 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 2028 KB Output is correct
2 Correct 37 ms 3436 KB Output is correct
3 Correct 32 ms 3692 KB Output is correct
4 Correct 41 ms 4356 KB Output is correct
5 Correct 49 ms 4844 KB Output is correct
6 Correct 47 ms 4844 KB Output is correct
7 Correct 49 ms 4844 KB Output is correct
8 Correct 56 ms 4844 KB Output is correct
9 Correct 48 ms 4716 KB Output is correct
10 Correct 47 ms 4844 KB Output is correct
11 Correct 47 ms 4716 KB Output is correct
12 Correct 48 ms 4736 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 8 ms 5996 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 56 ms 37580 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -