Submission #321593

#TimeUsernameProblemLanguageResultExecution timeMemory
321593CaroLindaBubble Sort 2 (JOI18_bubblesort2)C++14
100 / 100
5015 ms110408 KiB
#include <bits/stdc++.h>
#include "bubblesort2.h"

#define sz(x) (int)(x.size() )
#define all(x) x.begin(),x.end()

const int MAX = 1e6+10 ;
const int inf = 1e8+10 ;

using namespace std ;

int Key ;

struct Tree
{
	
	int tree[MAX*4] ;
	int lz[MAX*4] ;

	int m(int l, int r ) { return (l+r)>>1 ; }

	void refresh(int pos, int l, int r )
	{
		tree[pos] += lz[pos] ;

		if( l == r ) return (void)(lz[pos] = 0 ) ;

		lz[pos<<1] += lz[pos] ;
		lz[pos<<1|1] += lz[pos] ;

		lz[pos] = 0 ;

	}

	void updInterval(int pos, int l,int r, int beg, int en, int val )
	{
		refresh(pos,l,r) ;

		if( l > en || r < beg ) return ;
		if( l >= beg && r <= en )
		{
			lz[pos] += val ;
			refresh(pos,l,r) ;
			return ;
		}

		updInterval(pos<<1 , l, m(l,r) , beg, en, val ) ;
		updInterval(pos<<1|1 , m(l,r)+1, r, beg, en, val ) ;

		tree[pos] = max(tree[pos<<1], tree[pos<<1|1] ) ;

	}

	void updPoint(int pos, int l ,int r, int idx, int val )
	{
		refresh(pos,l,r) ;

		if( l > idx || r < idx ) return ;
		if( l == r ) return (void)(tree[pos] = val) ;

		updPoint(pos<<1 , l ,m(l,r), idx, val ) ;
		updPoint(pos<<1|1 , m(l,r)+1, r, idx, val ) ;	

		tree[pos] = max(tree[pos<<1] , tree[pos<<1|1] ) ;

	}

	int getMax() { refresh(1,0,1) ; return tree[1] ; }

} seg ;

struct Bit
{
	
	int bit[MAX] ;

	void upd(int pos, int x ) { for(; pos < MAX ; pos += pos & -pos ) bit[pos] += x ; }
	int qry(int pos )
	{
		int tot = 0 ;
		for(; pos > 0 ; pos -= pos & -pos ) tot += bit[pos] ;
		return tot ;
	}

} bit ;

vector<int> countScans( vector<int> A, vector<int> X, vector<int> V)
{

	int n = sz(A) ;
	int q = sz(V) ;

	map< pair<int,int> , int > compression ;

	for(int i = 0 ; i < n ; i++ ) compression[ make_pair(A[i],i) ] = 0 ;
	for(int i = 0 ; i < q ; i++ ) compression[ make_pair(V[i], X[i]) ] = 0 ;

	for(auto &e : compression ) e.second = ++Key ;

	for(int i = 0 ; i < n ; i++ ) A[i] = compression[ make_pair(A[i], i) ] ;
	for(int i = 0 ; i < q ; i++ ) V[i] = compression[ make_pair(V[i] , X[i] ) ] ;

	seg.updInterval(1,1,Key, 1,Key, -inf ) ;

	for(int i = 0 ; i < n ; i++ )	bit.upd(A[i], 1) ;
	for(int i = 0 ; i < n ; i++ ) seg.updPoint(1,1, Key,A[i],  i-bit.qry(A[i]-1) ) ;

	vector<int> ans ;

	for(int i = 0 ; i < q ; i++ )
	{
		bit.upd( A[ X[i] ] , -1 ) ;
		bit.upd( V[i] , 1 ) ;

		seg.updInterval( 1 , 1 , Key , A[ X[i] ] + 1 , Key , 1 ) ;
		seg.updInterval(1 , 1 , Key , V[i] + 1 , Key , -1 ) ;

		seg.updPoint(1 , 1  , Key , A[ X[i] ] , -inf ) ;
		seg.updPoint(1,1,Key, V[i] , X[i] - bit.qry(V[i] - 1) ) ;

		A[X[i]] = V[i] ;

		ans.push_back( seg.getMax() ) ;	
	
	}

	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...