Submission #711834

#TimeUsernameProblemLanguageResultExecution timeMemory
711834rainboyBubble Sort 2 (JOI18_bubblesort2)C++17
100 / 100
5056 ms52544 KiB
#include "bubblesort2.h"

using namespace std;

typedef vector<int> vi;

const int N = 500000, Q = 500000, N_ = N + Q + 1;

unsigned int Z = 12345;

int rand_() {
	return (Z *= 3) >> 1;
}

int aa[N];
int zz[N_ + 1], ll[N_ + 1], rr[N_ + 1], ii[N_ + 1], sz[N_ + 1], xx[N_ + 1], _, u_, l_, r_;

int node(int i) {
	static int _ = 1;

	zz[_] = rand_();
	ii[_] = i;
	sz[_] = 1;
	xx[_] = i + 1;
	return _++;
}

void pul(int u) {
	int l = ll[u], r = rr[u];

	sz[u] = sz[l] + 1 + sz[r];
	xx[u] = max(max(xx[l], ii[u]) + 1 + sz[r], xx[r]);
}

void split(int u, int i) {
	int c;

	if (u == 0) {
		u_ = l_ = r_ = 0;
		return;
	}
	c = aa[ii[u]] != aa[i] ? aa[ii[u]] - aa[i] : ii[u] - i;
	if (c < 0) {
		split(rr[u], i);
		rr[u] = l_, l_ = u;
	} else if (c > 0) {
		split(ll[u], i);
		ll[u] = r_, r_ = u;
	} else {
		u_ = u, l_ = ll[u], r_ = rr[u];
		ll[u] = rr[u] = 0;
	}
	pul(u);
}

int merge(int u, int v) {
	if (u == 0)
		return v;
	if (v == 0)
		return u;
	if (zz[u] < zz[v]) {
		rr[u] = merge(rr[u], v), pul(u);
		return u;
	} else {
		ll[v] = merge(u, ll[v]), pul(v);
		return v;
	}
}

void tr_add(int i) {
	split(u_, i);
	u_ = merge(merge(l_, node(i)), r_);
}

void tr_remove(int i) {
	split(u_, i);
	u_ = merge(l_, r_);
}

vi countScans(vi aa_, vi ii, vi bb) {
	int n = aa_.size();
	for (int i = 0; i < n; i++)
		aa[i] = aa_[i];
	for (int i = 0; i < n; i++)
		tr_add(i);
	int q = ii.size();
	vi ans(q);
	for (int h = 0; h < q; h++) {
		int i = ii[h], b = bb[h];
		tr_remove(i);
		aa[i] = b;
		tr_add(i);
		ans[h] = xx[u_] - n;
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...