Submission #1353176

#TimeUsernameProblemLanguageResultExecution timeMemory
1353176WarinchaiBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
1402 ms58816 KiB
#include "bubblesort2.h"
#include<bits/stdc++.h>
using namespace std;

long long inf=1e9;

struct segtree{
	long long info[4000005];
	long long lz[4000005];
	void apply(int st,int en,int i,long long val){
		info[i]+=val;
		lz[i]+=val;
	}
	void push(int st,int en,int i){
		int m=(st+en)/2;
		apply(st,m,i*2,lz[i]);
		apply(m+1,en,i*2+1,lz[i]);
		lz[i]=0;
	}
	void upd(int st,int en,int i,int l,int r,int val){
		if(st>r||en<l)return;
		//cerr<<"upd:"<<st<<" "<<en<<"\n";
		if(st>=l&&en<=r)return apply(st,en,i,val);
		push(st,en,i);
		int m=(st+en)/2;
		upd(st,m,i*2,l,r,val);
		upd(m+1,en,i*2+1,l,r,val);
		info[i]=max(info[i*2],info[i*2+1]);
	}
	int fans(int st,int en,int i,int l,int r){
		if(st>r||en<l)return -inf;
		if(st>=l&&en<=r)return info[i];
		push(st,en,i);
		int m=(st+en)/2;
		return max(fans(st,m,i*2,l,r),fans(m+1,en,i*2+1,l,r));
	}
	void build(int st,int en,int i){
		if(st==en)return info[i]=-inf,void();
		int m=(st+en)/2;
		build(st,m,i*2);
		build(m+1,en,i*2+1);
		info[i]=max(info[i*2],info[i*2+1]);
	}
}tr;

int val[500005];

std::vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V){
	vector<pair<int,int>>v;
	for(int i=0;i<A.size();i++)v.push_back({A[i],i+1}),val[i+1]=A[i];
	for(int i=0;i<X.size();i++)v.push_back({V[i],X[i]+1});
	sort(v.begin(),v.end());
	//for(auto x:v)cerr<<x.first<<" "<<x.second<<"\n";
	int x=v.size();
	tr.build(1,x,1);
	int N=A.size();
	//cerr<<"x:"<<x<<"\n";
	//cerr<<"work\n";
	for(int i=0;i<v.size();i++){
		tr.upd(1,x,1,i+1,i+1,v[i].second);
	}
	for(int i=1;i<=N;i++){
		int pos=lower_bound(v.begin(),v.end(),make_pair(val[i],i))-v.begin()+1;
		//cerr<<val[i]<<" "<<i<<"\n";
		//cerr<<"pos:"<<pos<<"\n";
		tr.upd(1,x,1,pos,pos,inf);
		tr.upd(1,x,1,pos,x,-1);
		/*cerr<<"ii:"<<i<<"\n";
		for(int i=1;i<=x;i++)cerr<<tr.fans(1,x,1,i,i)<<" ";
		cerr<<"\n";*/
	}
	//cerr<<"i:"<<0<<"\n";
	//for(int i=1;i<=x;i++)cerr<<tr.fans(1,x,1,i,i)<<" ";
	//cerr<<"\n";
	//cerr<<"done\n";
	//cerr<<"ans:"<<tr.fans(1,x,1,1,x)<<"\n";
	//cerr<<"STT:\n";
	vector<int>ans;
	for(int i=0;i<X.size();i++){
		int pos=lower_bound(v.begin(),v.end(),make_pair(A[X[i]],X[i]+1))-v.begin()+1;
		tr.upd(1,x,1,pos,pos,-inf);
		tr.upd(1,x,1,pos,x,+1);
		A[X[i]]=V[i];
		pos=lower_bound(v.begin(),v.end(),make_pair(A[X[i]],X[i]+1))-v.begin()+1;
		tr.upd(1,x,1,pos,pos,inf);
		tr.upd(1,x,1,pos,x,-1);
		ans.push_back(tr.fans(1,x,1,1,x));
		//cerr<<"i:"<<i<<"\n";
		//for(int i=1;i<=x;i++)cerr<<tr.fans(1,x,1,i,i)<<" ";
		//cerr<<"\n";
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...