제출 #1345598

#제출 시각아이디문제언어결과실행 시간메모리
1345598Faisal_SaqibIndex (COCI21_index)C++20
110 / 110
366 ms32456 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=2e5+10,LG=20;
int a[N],n,fen[N],l[N],r[N],bl[N],br[N];
vector<int> cur[N],oc[N];
void add(int p,int v=1)
{
	while(p<N)
	{
		fen[p]+=v;
		p+=(p&-p);
	}
}
int get(int x)
{
	int ans=0;
	while(x)
	{
		ans+=fen[x];
		x-=(x&-x);
	}
	return ans;
}
int get(int l,int r)
{
	return get(r)-get(l-1);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		oc[a[i]].push_back(i);
	}
	for(int i=0;i<q;i++)
	{
		cin>>l[i]>>r[i];
		bl[i]=0,br[i]=2e5+1;
		cur[(bl[i]+br[i])/2].push_back(i);
	}
	for(int j=0;j<LG;j++)
	{
		for(int i=N-1;i>=0;i--)
		{
			for(auto&ind:oc[i])
			{
				add(ind);
			}
			for(auto&id:cur[i])
			{
				if(get(l[id],r[id])>=i)
				{
					bl[id]=i;
				}
				else
				{
					br[id]=i;
				}
				if(bl[id]+1<br[id])
					cur[(bl[id]+br[id])/2].push_back(id);
			}
			cur[i].clear();
		}
		for(int i=0;i<N;i++)fen[i]=0;
	}
	for(int i=0;i<q;i++)
	{
		cout<<bl[i]<<endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...