제출 #1347877

#제출 시각아이디문제언어결과실행 시간메모리
1347877jahongirBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
1116 ms42284 KiB
#include "bubblesort2.h"
#include <bits/stdc++.h>

using namespace std;
typedef pair<int,int> pii;

const int mxn = 1e6+10;
int st[1<<21], lz[1<<21];
pii pos[mxn];
int bit[mxn];

void add(int i, int v){
	for(i++; i < mxn; i+=i&-i)
		bit[i] += v;
}

int get(int i){
	int res = 0;
	for(i++; i > 0; i-=i&-i)
		res += bit[i];
	return res;
}


void push(int i){
	if(lz[i]){
		st[i<<1] += lz[i], lz[i<<1] += lz[i];
		st[i<<1|1] += lz[i], lz[i<<1|1] += lz[i];
		lz[i] = 0;
	}
}

void pointSet(int i, int l, int r, int k, int v){
	if(l==r){st[i] += v; return;}
	int m = (l+r)>>1; push(i);
	if(k <= m) pointSet(i<<1,l,m,k,v);
	else pointSet(i<<1|1,m+1,r,k,v);
	st[i] = max(st[i<<1],st[i<<1|1]);
}

void RangeAdd(int i, int l, int r, int s, int e, int v){
	if(r < s || l > e) return;
	if(s <= l && r <= e){st[i]+=v,lz[i]+=v; return;}
	int m = (l+r)>>1; push(i);
	RangeAdd(i<<1,l,m,s,e,v);
	RangeAdd(i<<1|1,m+1,r,s,e,v);
	st[i] = max(st[i<<1],st[i<<1|1]);
}

vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V){
	int N = (int) A.size();
	int Q = (int) X.size();
	
	for(int i = 0; i < N; i++)
		pos[i] = {A[i],i};
	for(int i = 0; i < Q; i++)
		pos[i+N] = {V[i],X[i]};
	sort(pos,pos+N+Q);
	int M = unique(pos,pos+N+Q)-pos;

	for(int i = 0; i < N; i++){
		auto it = lower_bound(pos,pos+M,pii{A[i],i}) - pos;
		pointSet(1,0,M-1,it,i);
		add(it,1);
		RangeAdd(1,0,M-1,it+1,M-1,-1);
	}
	
	vector<int> res(Q);
	for(int t = 0; t < Q; t++){
		int i = X[t];
		auto it = lower_bound(pos,pos+M,pii{A[i],i}) - pos;
		RangeAdd(1,0,M-1,it+1,M-1,1);
		add(it,-1);
		pointSet(1,0,M-1,it,-i);
		
		A[i] = V[t];
	
		it = lower_bound(pos,pos+M,pii{A[i],i}) - pos;
		pointSet(1,0,M-1,it,i);		
		add(it,1);
		RangeAdd(1,0,M-1,it+1,M-1,-1);

		res[t] = st[1];
	}
	
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...