Submission #1354369

#TimeUsernameProblemLanguageResultExecution timeMemory
1354369nagorn_phBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
1165 ms38516 KiB
#include "bubblesort2.h"
#include <bits/stdc++.h>
#define pii pair <int, int>
#define emb emplace_back
#define all(a) a.begin(), a.end()

using namespace std;

const int N = 1e6 + 5;

int sz;

struct lazy {
	int seg[4 * N], lazy[4 * N];
	void push(int l, int r, int i){
		seg[i] += lazy[i];
		if (l != r) lazy[2 * i] += lazy[i], lazy[2 * i + 1] += lazy[i];
		lazy[i] = 0;
	}
	void update(int l, int r, int i, int ll, int rr, int val){
		push(l, r, i);
		if (l >= ll && r <= rr) return lazy[i] += val, push(l, r, i), void();
		if (r < ll || l > rr) return;
		int mid = (l + r) / 2;
		update(l, mid, 2 * i, ll, rr, val), update(mid + 1, r, 2 * i + 1, ll, rr, val);
		seg[i] = max(seg[2 * i], seg[2 * i + 1]);
	}
	int query(int l, int r, int i, int ll, int rr){
		push(l, r, i);
		if (l >= ll && r <= rr) return seg[i];
		if (r < ll || l > rr) return 0;
		int mid = (l + r) / 2;
		return max(query(l, mid, 2 * i, ll, rr), query(mid + 1, r, 2 * i + 1, ll, rr));
	}
} seg;

void printseg(){
	for (int i = 1; i <= sz; i++) {

	}
}

vector<int> countScans(vector<int> a,vector<int> x,vector<int> v){
	int q=x.size(), n = a.size();
	vector <int> ans(q);
	vector <pii> comp;
	for (int i = 0; i < n; i++) {
		comp.emb(a[i], i);
	}
	for (int i = 0; i < q; i++) {
		comp.emb(v[i], x[i]);
	}
	sort(all(comp));
	sz = comp.size();
	for (int i = 0; i < n; i++) {
		int idx = lower_bound(all(comp), make_pair(a[i], i)) - comp.begin() + 1;
		seg.update(1, sz, 1, idx, idx, i + 1);
		seg.update(1, sz, 1, idx + 1, sz, -1);
	}
	// cout << "INIT: ";
	for (int i = 0; i < q; i++) {
		pii pre = {a[x[i]], x[i]};
		int idx = lower_bound(all(comp), pre) - comp.begin() + 1;
		seg.update(1, sz, 1, idx, idx, -x[i] - 1);
		seg.update(1, sz, 1, idx + 1, sz, 1);
		a[x[i]] = v[i];
		idx = lower_bound(all(comp), make_pair(v[i], x[i])) - comp.begin() + 1;
		seg.update(1, sz, 1, idx, idx, x[i] + 1);
		seg.update(1, sz, 1, idx + 1, sz, -1);
		ans[i] = (seg.query(1, sz, 1, 1, sz) - 1);
	}
	return ans;
}

/*
4 2
1 2 3 4
0 3
2 1
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...