제출 #1345511

#제출 시각아이디문제언어결과실행 시간메모리
1345511Faisal_SaqibIndex (COCI21_index)C++20
0 / 110
2 ms580 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=2e5+10;
int a[N],n;
const int M=6e6;
int sm[M],lc[M],rc[M],lst=0;
int gnn(int ref=-1)
{
	int cn=lst++;
	sm[cn]=0;
	if(ref!=-1)lc[cn]=lc[ref],rc[cn]=rc[ref];
	return cn;
}
int build(int l=1,int r=n)
{
	int v=gnn();
	if(l==r)
		return v;
	int m=(l+r)>>1;
	lc[v]=build(l,m);
	rc[v]=build(m+1,r);
	return v;
}
void set(int&v,int i,int l=1,int r=n)
{
	if(i<l or r<i)return;
	v=gnn(v);
	if(l==r)
	{
		sm[v]=1;
		return;
	}
	int m=(l+r)>>1;
	set(lc[v],i,l,m);
	set(rc[v],i,m+1,r);
	sm[v]=sm[lc[v]]+sm[rc[v]];
}
int qry(int&v,int ql,int qr,int l=1,int r=n)
{
	if(qr<l or r<ql)return 0;
	if(ql<=l and r<=qr)
		return sm[v];
	int m=(l+r)>>1;
	return qry(lc[v],ql,qr,l,m)+qry(rc[v],ql,qr,m+1,r);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int q;
	cin>>n>>q;
	vector<pair<int,int>> tp;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		tp.push_back({a[i],i});
	}
	sort(rbegin(tp),rend(tp));
	vector<int> ver={build()};
	for(auto [x,i]:tp)
	{
		// cout<<"x "<<x<<' '<<i<<endl;
		ver.push_back(ver.back());
		set(ver.back(),i);
	}
	while(q--)
	{
		int l,r;
		cin>>l>>r;
		int s=-1,e=tp.size()-1;
		while(s+1<e)
		{
			int m=(s+e)>>1;
			// cout<<"Checking "<<tp[m].first<<' '<<tp[m].second<<' '<<qry(ver[m+1],l,r)<<endl;
			if(qry(ver[m+1],l,r)-tp[m].first >=0)
			{
				e=m;
			}
			else
			{
				s=m;
			}
		}
		cout<<tp[e].first<<endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...