Submission #277091

#TimeUsernameProblemLanguageResultExecution timeMemory
277091ChrisTBubble Sort 2 (JOI18_bubblesort2)C++17
100 / 100
4086 ms70384 KiB
#include <bits/stdc++.h>
using namespace std;
#define lc ind<<1
#define rc ind<<1|1
const int MN = 1e6 + 5;
vector<pair<int,int>> xs; int sz;
int getx (const pair<int,int> &x) {return lower_bound(xs.begin(),xs.end(),x) - xs.begin() + 1;}
struct Node {
	int mx,lz;
} tree[MN<<2];
void push_down (int ind, int l, int r) {
	if (!tree[ind].lz) return;
	tree[ind].mx += tree[ind].lz;
	if (l!=r) {
		tree[lc].lz += tree[ind].lz;
		tree[rc].lz += tree[ind].lz;
	}
	tree[ind].lz = 0;
}
void update (int ind, int tl, int tr, int l, int r, int v) {
	push_down(ind,tl,tr);
	if (l > tr || r < tl) return;
	if (l <= tl && tr <= r) {
		tree[ind].lz += v;
		push_down(ind,tl,tr);
		return;
	}
	int mid = (tl + tr) / 2;
	update(lc,tl,mid,l,r,v); update(rc,mid+1,tr,l,r,v);
	tree[ind].mx = max(tree[lc].mx,tree[rc].mx);
}
int query (int ind, int tl, int tr, int l, int r) {
	push_down(ind,tl,tr);
	if (l > tr || r < tl) return INT_MIN;
	if (l <= tl && tr <= r) return tree[ind].mx;
	int mid = (tl + tr) / 2;
	return max(query(lc,tl,mid,l,r),query(rc,mid+1,tr,l,r));
}
int bit[MN];
void u (int x, int v) {
	for (;x<MN;x+=x&-x)
		bit[x] += v;
}
int qu (int x) {
	int ret = 0;
	for (;x;x^=x&-x)
		ret += bit[x];
	return ret;
}
void s (int x, int v) {
	int cur = query(1,1,sz,x,x);
	update(1,1,sz,x,x,v - cur);
}
vector<int> countScans (vector<int> a, vector<int> x, vector<int> v) {
	int n = a.size(), q = x.size(); vector<int> ret(q);
	for (int i = 0; i < n; i++) xs.emplace_back(a[i],i);
	for (int i = 0; i < q; i++) xs.emplace_back(v[i],x[i]);
	sort(xs.begin(),xs.end()); xs.erase(unique(xs.begin(),xs.end()),xs.end());
	for (Node &nd : tree) nd = {-MN*1000,0};
	sz = xs.size();
	for (int i = 0; i < n; i++) u(getx({a[i],i}),1);
	for (int i = 0; i < n; i++) {
		int pos = getx({a[i],i});
		s(pos,i - qu(pos-1));
	}
	for (int i = 0; i < q; i++) {
		int oldpos = getx({a[x[i]],x[i]});
		s(oldpos,-1e9);
		if (oldpos + 1 <= sz) update(1,1,sz,oldpos+1,sz,1);
		a[x[i]] = v[i];
		int pos = getx({v[i],x[i]});
		u(oldpos,-1); u(pos,1);
		s(pos,x[i] - qu(pos-1));
		if (pos + 1 <= sz) update(1,1,sz,pos+1,sz,-1);
		ret[i] = query(1,1,sz,1,sz);
	}
	return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...