Submission #1305609

#TimeUsernameProblemLanguageResultExecution timeMemory
1305609petezaBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
2523 ms115892 KiB
//little anger, how blessing to be capable of fireeee
#include <bits/stdc++.h>
#include "bubblesort2.h"
using namespace std;
using ll = long long;
const ll rinf = -2000000000ll;
const ll ninf = -2003000000ll;
 
int aq;
vector<pair<int, int>> qrss;
ll laz[4000005], segm[4000005], segs[4000005];
 
void plaz(int idx, int cnt) {
	segm[idx] += laz[idx];
	if(cnt > 1) {
		laz[idx*2+1] += laz[idx];
		laz[idx*2+2] += laz[idx];
	}
	laz[idx]=0;
}
 
void updset(int idx, int l, int r, int tgt, int val) {
	plaz(idx, r-l+1);
	if(l == r) {
		segm[idx] = val;
		segs[idx] = (val > rinf);
		return;
	}
	int mid = (l+r) >> 1;
	if(tgt <= mid) updset(idx*2+1, l, mid, tgt, val);
	else updset(idx*2+2, mid+1, r, tgt, val);
	plaz(idx*2+1, mid-l+1); plaz(idx*2+2, r-mid);
	segm[idx] = max(segm[idx*2+1], segm[idx*2+2]);
	//printf("Set segm[%d] = %lld\n", idx, segm[idx]);
	//printf("It's from %lld and %lld\n", segm[idx*2+1], segm[idx*2+2]);
	segs[idx] = segs[idx*2+1] + segs[idx*2+2];
}
 
void updrng(int idx, int l, int r, int tl, int tr, int val) {
	plaz(idx, r-l+1);
	if(tl <= l && r <= tr) {
		laz[idx] += val;
		plaz(idx, r-l+1);
		//cout << "INstant " << idx << " -> " << segm[idx] << '\n';
		return;
	}
	if(tr < l || r < tl) return ;
	int mid = (l+r) >> 1;
	updrng(idx*2+1, l, mid, tl, tr, val);
	updrng(idx*2+2, mid+1, r, tl, tr, val);
	segm[idx] = max(segm[idx*2+1], segm[idx*2+2]);
	//printf("Set segm[%d] = %lld\n", idx, segm[idx]);
	//printf("It's from %lld and %lld\n", segm[idx*2+1], segm[idx*2+2]);
}
 
ll qrs(int idx, int l, int r, int tl, int tr) {
	plaz(idx, r-l+1);
	if(tl <= l && r <= tr) return segs[idx];
	if(r < tl || tr < l) return 0;
	int mid = (l+r) >> 1;
	return qrs(idx*2+1, l, mid, tl, tr) + qrs(idx*2+2, mid+1, r, tl, tr);
}
 
ll qrm(int idx, int l, int r, int tl, int tr) {
	plaz(idx, r-l+1);
	if(tl <= l && r <= tr) return segm[idx];
	if(r < tl || tr < l) return ninf;
	int mid = (l+r) >> 1;
	return max(qrm(idx*2+1, l, mid, tl, tr), qrm(idx*2+2, mid+1, r, tl, tr));
}
 
void addElem(int x, int v) {
	//assumes element is currently not there
	auto idx = lower_bound(qrss.begin(), qrss.end(), make_pair(v, x)) - qrss.begin();
	assert(qrss[idx] == make_pair(v, x));
	int bfs = qrs(0, 0, aq, 0, idx);
	//cout << "HEYHEY IM ADDINGHEYYYYYYYYYYYY\n";
	updrng(0, 0, aq, idx, aq, -1);
	//cout << "im adding -1 to " << idx << " til " << aq << '\n';
	updset(0, 0, aq, idx, x-bfs);
}
 
void delElem(int x, int v) {
	//assumes element is there
	auto idx = lower_bound(qrss.begin(), qrss.end(), make_pair(v, x)) - qrss.begin();
	assert(qrss[idx] == make_pair(v, x));
	updset(0, 0, aq, idx, ninf);
	int bfs = qrs(0, 0, aq, 0, idx);
	updrng(0, 0, aq, idx, aq, 1);
	//cout << "im adding 1 to " << idx << " til " << aq << '\n';
}
 
vector<int> countScans(vector<int> A, vector<int> X, vector<int> V) {
	int n = A.size(), q = X.size();
	//vector<pair<int, int>> qrs;
	qrss.clear();
	for(int i=0;i<n;i++) qrss.emplace_back(A[i], i);
	for(int i=0;i<q;i++) qrss.emplace_back(V[i], X[i]);
	sort(qrss.begin(), qrss.end());
	qrss.resize(unique(qrss.begin(), qrss.end()) - qrss.begin());
	aq = qrss.size();
	for(int i=0;i<=4*aq;i++) {
		segm[i] = ninf;
		laz[i] = segs[i] = 0;
	}
	for(int i=0;i<n;i++) {
		addElem(i, A[i]);
	}
	//cout << segm[0] << "___"; for(int i=0;i<=aq;i++) cout << qrm(0, 0, aq, i, i) << ' '; cout << '\n';
	vector<int> ans(q);
	for(int i=0;i<q;i++) {
		delElem(X[i], A[X[i]]);
		A[X[i]]=V[i];
		addElem(X[i], A[X[i]]);
		//cout << segm[0] << "___";
		ans[i] = max(0ll, qrm(0, 0, aq, 0, aq));
		//for(int i=0;i<=aq;i++) cout << qrm(0, 0, aq, i, i) << ' ';
		//cout << '\n';
	}
	return ans;
}
 
/*
int main() {
	// your code goes here
	//auto res = countScans({1,2,3,4},{0,2},{3,1});
	auto res = countScans({1,2,3,4},{0,2},{0,1});
	for(auto&e:res) cout << e << " ";
	return 0;
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...