Submission #1357241

#TimeUsernameProblemLanguageResultExecution timeMemory
1357241nathlol2Bubble Sort 2 (JOI18_bubblesort2)C++20
60 / 100
2000 ms589824 KiB
#include "bubblesort2.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5, MX = 1e9;
map<int, set<int>> pos;
set<int> el;

struct lazysparseseg{
	struct node{
		int v, lz;
		node *l, *r;
		node(int v):v(v), lz(0), l(0), r(0){}
	};
	typedef node* pnode;
	pnode rt = 0;
	void push(pnode &k, int l, int r){
		if(!k) return;
		if(k->lz != 0){
			k->v += k->lz;
			if(l != r){
				if(!k->l) k->l = new node(0);
				k->l->lz += k->lz;
				if(!k->r) k->r = new node(0);
				k->r->lz += k->lz;
			}
			k->lz = 0;
		}
	}
	void upd(pnode &k, int l, int r, int ql, int qr, int x){
		if(qr < l || r < ql) return;
		if(!k) k = new node(0);
		push(k, l, r);
		if(ql <= l && r <= qr){
			k->lz += x;
			push(k, l, r);
			return;
		}
		int md = (l + r) / 2;
		upd(k->l, l, md, ql, qr, x);
		upd(k->r, md + 1, r, ql, qr, x);
		if(k->l) push(k->l, l, md);
		if(k->r) push(k->r, md + 1, r);
		k->v = max(k->l ? k->l->v : 0, k->r ? k->r->v : 0);
	}
	int qry(pnode k, int l, int r, int ql, int qr){
		push(k, l, r);
		if(!k || qr < l || r < ql) return 0;
		if(ql <= l && r <= qr) return k->v;
		int md = (l + r) / 2;
		return max(qry(k->l, l, md, ql, qr), qry(k->r, md + 1, r, ql, qr));
	}
}s;

vector<int> countScans(vector<int> A, vector<int> X, vector<int> V){
	int n = A.size(), q = X.size();
	vector<int> ans(q);
	for(int i = 0;i<n;i++){
		pos[A[i]].insert(i);
		s.upd(s.rt, 1, MX, A[i], MX, -1);
	}
	for(auto [el, ss] : pos){
		s.upd(s.rt, 1, MX, el, el, *ss.rbegin());
	}
	for(int i = 0;i<q;i++){
		int tb = *pos[A[X[i]]].rbegin();
		pos[A[X[i]]].erase(X[i]);
		int nw;
		if(pos[A[X[i]]].empty()) nw = 0;
		else nw = *pos[A[X[i]]].rbegin();
		s.upd(s.rt, 1, MX, A[X[i]], A[X[i]], nw - tb);
		int tv;
		if(pos[V[i]].empty()) tv = 0;
		else tv = *pos[V[i]].rbegin();
		pos[V[i]].insert(X[i]);
		s.upd(s.rt, 1, MX, V[i], V[i], *pos[V[i]].rbegin() - tv);
		if(A[X[i]] < V[i]) s.upd(s.rt, 1, MX, A[X[i]], V[i] - 1, 1);
		else if(V[i] < A[X[i]]) s.upd(s.rt, 1, MX, V[i], A[X[i]] - 1, -1);
		A[X[i]] = V[i];
		ans[i] = s.qry(s.rt, 1, MX, 1, MX) + 1;
	}
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...