Submission #110042

# Submission time Handle Problem Language Result Execution time Memory
110042 2019-05-09T02:23:36 Z qkxwsm Sterilizing Spray (JOI15_sterilizing) C++14
100 / 100
4395 ms 206812 KB
//clever
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/rope>

using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;

random_device(rd);
mt19937 rng(rd());
const long long FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();

struct custom_hash
{
	template<class T>
	unsigned long long operator()(T v) const
	{
		unsigned long long x = v;
		x += FIXED_RANDOM;
		// x += 11400714819323198485ull;
		// x = (x ^ (x >> 30)) * 13787848793156543929ull;
		x = (x ^ (x >> 27)) * 10723151780598845931ull;
		return x ^ (x >> 31);
	}
};

template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<class T, class U> using hash_table = gp_hash_table<T, U, custom_hash>;

template<class T>
T randomize(T mod)
{
	return (uniform_int_distribution<T>(0, mod - 1))(rng);
}
template<class T>
void readi(T &x)
{
	x = 0;
	bool negative = false;
	char c = ' ';
	while (c < '-')
	{
		c = getchar();
	}
	if (c == '-')
	{
		negative = true;
		c = getchar();
	}
	while (c >= '0')
	{
		x = x * 10 + (c - '0');
		c = getchar();
	}
	if (negative)
	{
		x = -x;
	}
}
template<class T>
void printi(T output)
{
	if (output == 0)
	{
		putchar('0');
		return;
	}
	if (output < 0)
	{
		putchar('-');
		output = -output;
	}
	int buf[20], n = 0;
	while(output)
	{
		buf[n] = ((output % 10));
		output /= 10;
		n++;
	}
	for (n--; n >= 0; n--)
	{
		putchar(buf[n] + '0');
	}
	return;
}
template<class T>
void ckmin(T &a, T b)
{
	a = min(a, b);
}
template<class T>
void ckmax(T &a, T b)
{
	a = max(a, b);
}
long long expo(long long a, long long e, long long mod)
{
	return ((e == 0) ? 1 : ((expo(a * a % mod, e >> 1, mod)) * ((e & 1) ? a : 1) % mod));
}
template<class T, class U>
void nmod(T &x, U mod)
{
	if (x >= mod) x -= mod;
}
template<class T>
T gcd(T a, T b)
{
	return (b ? gcd(b, a % b) : a);
}

#define y0 ___y0
#define y1 ___y1
#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define DBG(x) cerr << #x << " = " << (x) << endl
#define SZ(x) ((int) ((x).size()))
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)
#define ALL(x) (x).begin(), (x).end()

const long double PI = 4.0 * atan(1.0);
const long double EPS = 1e-9;

#define MAGIC 347
#define SINF 10007
#define CO 1000007
#define INF 1000000007
#define BIG 1000000931
#define LARGE 1696969696967ll
#define GIANT 2564008813937411ll
#define LLINF 2696969696969696969ll
#define MAXN 100013

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pdd;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<ld> vd;
typedef vector<pii> vpi;
typedef vector<pll> vpl;
typedef vector<pdd> vpd;

typedef queue<ll> qi;

int N, Q, K;
int arr[MAXN];
qi seg[3 * MAXN];
int lazy[3 * MAXN];

qi comb(qi a, qi b)
{
	qi res;
	while(!a.empty() || !b.empty())
	{
		ll x = 0, y = 0;
		if (!a.empty())
		{
			x = a.front(); a.pop();
		}
		if (!b.empty())
		{
			y = b.front(); b.pop();
		}
		res.push(x + y);
	}
	return res;
}
qi breakdown(int x)
{
	qi res;
	if (K == 1)
	{
		res.push(x);
		return res;
	}
	while(x)
	{
		res.push(x % K);
		x /= K;
	}
	return res;
}
ll decode(qi d)
{
	ll pw = 1, res = 0;
	while(!d.empty())
	{
		res += d.front() * pw;
		d.pop();
		pw *= K;
	}
	return res;
}
void push(int w, int L, int R)
{
	FOR(i, 0, lazy[w])
	{
		if (!seg[w].empty()) seg[w].pop();
	}
	if (L != R)
	{
		lazy[w << 1] += lazy[w];
		lazy[w << 1 | 1] += lazy[w];
	}
	lazy[w] = 0;
}
void upd1(int w, int L, int R, int a, int v)
{
	push(w, L, R);
	if (a < L || R < a) return;
	if (L == R)
	{
		seg[w] = breakdown(v);
		return;
	}
	int mid = (L + R) >> 1;
	upd1(w << 1, L, mid, a, v);
	upd1(w << 1 | 1, mid + 1, R, a, v);
	seg[w] = comb(seg[w << 1], seg[w << 1 | 1]);
}
void upd2(int w, int L, int R, int a, int b)
{
	push(w, L, R);
	if (b < L || R < a) return;
	if (a <= L && R <= b)
	{
		lazy[w]++;
		push(w, L, R);
		return;
	}
	int mid = (L + R) >> 1;
	upd2(w << 1, L, mid, a, b);
	upd2(w << 1 | 1, mid + 1, R, a, b);
	seg[w] = comb(seg[w << 1], seg[w << 1 | 1]);
}
void setv(int idx, int v)
{
	upd1(1, 0, N - 1, idx, v);
}
void spray(int l, int r)
{
	if (K == 1) return;
	upd2(1, 0, N - 1, l, r);
}
ll query(int w, int L, int R, int a, int b)
{
	push(w, L, R);
	if (b < L || R < a) return 0;
	if (a <= L && R <= b)
	{
		return decode(seg[w]);
	}
	int mid = (L + R) >> 1;
	return query(w << 1, L, mid, a, b) + query(w << 1 | 1, mid + 1, R, a, b);
}
void build(int w, int L, int R)
{
	if (L == R)
	{
		seg[w] = breakdown(arr[L]);
		lazy[w] = 0;
		return;
	}
	int mid = (L + R) >> 1;
	build(w << 1, L, mid);
	build(w << 1 | 1, mid + 1, R);
	seg[w] = comb(seg[w << 1], seg[w << 1 | 1]);
}

int32_t main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	// cout << fixed << setprecision(10);
	// cerr << fixed << setprecision(10);
	// if (fopen("file.in", "r"))
	// {
	// 	freopen ("file.in", "r", stdin);
	// 	freopen ("file.out", "w", stdout);
	// }
	cin >> N >> Q >> K;
	FOR(i, 0, N)
	{
		cin >> arr[i];
	}
	build(1, 0, N - 1);
	while(Q--)
	{
		int qid;
		cin >> qid;
		if (qid == 1)
		{
			int a, b;
			cin >> a >> b; a--;
			setv(a, b);
		}
		if (qid == 2)
		{
			int l, r;
			cin >> l >> r; l--; r--;
			spray(l, r);
		}
		if (qid == 3)
		{
			int l, r;
			cin >> l >> r; l--; r--;
			ll res = query(1, 0, N - 1, l, r);
			cout << res << '\n';
		}
	}
	// cerr << "time elapsed = " << (clock() / (CLOCKS_PER_SEC / 1000)) << " ms" << endl;
	return 0;
}
/* READ READ READ
* int overflow, maxn too small, special cases (n=1?, two distinct?), cin.tie() interactive
* reread the problem, try small cases
* note down possible sources of error as you go
* do smth instead of nothing
*/
# Verdict Execution time Memory Grader output
1 Correct 218 ms 202360 KB Output is correct
2 Correct 219 ms 202472 KB Output is correct
3 Correct 197 ms 202552 KB Output is correct
4 Correct 226 ms 202364 KB Output is correct
5 Correct 217 ms 202360 KB Output is correct
6 Correct 225 ms 202568 KB Output is correct
7 Correct 220 ms 202588 KB Output is correct
8 Correct 215 ms 202488 KB Output is correct
9 Correct 232 ms 202360 KB Output is correct
10 Correct 244 ms 202520 KB Output is correct
11 Correct 240 ms 202556 KB Output is correct
12 Correct 253 ms 202488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 983 ms 204832 KB Output is correct
2 Correct 859 ms 204796 KB Output is correct
3 Correct 758 ms 205312 KB Output is correct
4 Correct 955 ms 205560 KB Output is correct
5 Correct 1171 ms 205552 KB Output is correct
6 Correct 1071 ms 205624 KB Output is correct
7 Correct 1214 ms 205632 KB Output is correct
8 Correct 1131 ms 205560 KB Output is correct
9 Correct 1066 ms 205692 KB Output is correct
10 Correct 1077 ms 205688 KB Output is correct
11 Correct 1092 ms 205660 KB Output is correct
12 Correct 1083 ms 205688 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 563 ms 202964 KB Output is correct
2 Correct 524 ms 203412 KB Output is correct
3 Correct 680 ms 203640 KB Output is correct
4 Correct 1734 ms 203984 KB Output is correct
5 Correct 3169 ms 205564 KB Output is correct
6 Correct 3018 ms 205368 KB Output is correct
7 Correct 1071 ms 205560 KB Output is correct
8 Correct 2658 ms 205532 KB Output is correct
9 Correct 3823 ms 205168 KB Output is correct
10 Correct 4130 ms 205432 KB Output is correct
11 Correct 4062 ms 205252 KB Output is correct
12 Correct 4016 ms 205488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1531 ms 203400 KB Output is correct
2 Correct 1878 ms 203540 KB Output is correct
3 Correct 1243 ms 204532 KB Output is correct
4 Correct 1794 ms 204900 KB Output is correct
5 Correct 2856 ms 206812 KB Output is correct
6 Correct 2835 ms 206584 KB Output is correct
7 Correct 3159 ms 206616 KB Output is correct
8 Correct 3388 ms 206748 KB Output is correct
9 Correct 4183 ms 206444 KB Output is correct
10 Correct 4281 ms 206616 KB Output is correct
11 Correct 4395 ms 206652 KB Output is correct
12 Correct 4061 ms 206456 KB Output is correct