Submission #403220

#TimeUsernameProblemLanguageResultExecution timeMemory
403220MohamedAhmed04Index (COCI21_index)C++14
110 / 110
846 ms19440 KiB
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 2e5 + 10 ;

int arr[MAX] , L[MAX] , R[MAX] ;
int n , q ;
int cnt[MAX] , ans[MAX] ;

vector< pair<int , int> >vp(MAX) ;
vector<int>queries[MAX] ;

int bit[MAX] ;

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

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

int query(int l , int r)
{
	return (get(r) - get(l - 1)) ; 
}

void init()
{
	for(int i = 1 ; i <= n ; ++i)
		queries[i].clear() ;
	memset(bit , 0 , sizeof(bit)) ;
	memset(cnt , 0 , sizeof(cnt)) ; 
}

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>q ;
	for(int i = 1 ; i <= n ; ++i)
		cin>>arr[i] ;
	for(int i = 1 ; i <= q ; ++i)
	{
		cin>>L[i]>>R[i] ;
		vp[i] = {1 , n} ;
	}
	bool ok = false ;
	while(!ok)
	{
		ok = true ;
		init() ;
		for(int i = 1 ; i <= q ; ++i)
		{
			if(vp[i].first > vp[i].second)
				continue ;
			ok = false ;
			queries[L[i]-1].push_back(-i) ;
			queries[R[i]].push_back(i) ;
		}
		for(int i = 1 ; i <= n ; ++i)
		{
			add(arr[i] , 1) ;
			for(auto &j : queries[i])
			{
				int sgn = 1 ;
				if(j < 0)
					j *= -1 , sgn = -1 ;
				cnt[j] += sgn * query((vp[j].first + vp[j].second) >> 1 , MAX-1) ;
			}
		}
		for(int i = 1 ; i <= q ; ++i)
		{
			if(vp[i].first > vp[i].second)
				continue ;
			int x = (vp[i].first + vp[i].second) >> 1 ;
			if(cnt[i] >= x)
				ans[i] = x , vp[i].first = x+1 ;
			else
				vp[i].second = x-1 ;
		}
	}
	for(int i = 1 ; i <= q ; ++i)
		cout<<ans[i]<<"\n" ;
	return 0 ;
}		
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...