Submission #1345588

#TimeUsernameProblemLanguageResultExecution timeMemory
1345588MuhammadSaramIndex (COCI21_index)C++20
110 / 110
1041 ms93420 KiB
#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

struct node
{
	int su=0, s, e, lc, rc;
};

const int M = 2e5 + 3;

int rt[M], tot=1;
vector<node> seg;
vector<int> ind[M];

void add()
{
	node a;seg.push_back(a);
}

void modify(int p,int v)
{
	if (seg[v].s+1==seg[v].e)
	{
		seg[v].su=1;
		return;
	}
	int mid=(seg[v].s+seg[v].e)/2;
	if (p<mid)
		add(), seg[tot]=seg[seg[v].lc], seg[v].lc=tot, modify(p,tot++);
	else
		add(), seg[tot]=seg[seg[v].rc], seg[v].rc=tot, modify(p,tot++);
	seg[v].su=seg[seg[v].lc].su+seg[seg[v].rc].su;
}

int get(int l,int r,int v)
{
	if (l>=seg[v].e or r<=seg[v].s) return 0;
	if (l<=seg[v].s && seg[v].e<=r) return seg[v].su;
	return get(l,r,seg[v].lc)+get(l,r,seg[v].rc);
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL), cout.tie(NULL);

	int n,qr;
	cin>>n>>qr;
	int a[n];
	for (int i=0;i<n;i++)
		cin>>a[i], ind[a[i]].push_back(i);
	add(), rt[M-2]=0, seg[0].s=0, seg[0].e=n;
	queue<int> q;
	q.push(0);
	while (!q.empty())
	{
		int x=q.front();q.pop();
		if (seg[x].s+1==seg[x].e) continue;
		int mid=(seg[x].s+seg[x].e)/2;
		add(), seg[x].lc=tot, seg[tot].s=seg[x].s, seg[tot++].e=mid;
		add(), seg[x].rc=tot, seg[tot].s=mid, seg[tot++].e=seg[x].e;
		q.push(seg[x].lc), q.push(seg[x].rc);
	}
	for (int i=M-3;i>0;i--)
	{
		add(), rt[i]=tot, seg[tot++]=seg[rt[i+1]];
		for (int x:ind[i])
			modify(x,rt[i]);
	}
	while (qr--)
	{
		int l, r;
		cin>>l>>r;l--;
		int s=1, e=M;
		while (s+1<e)
		{
			int mid=(s+e)/2;
			if (get(l,r,rt[mid])>=mid)
				s=mid;
			else
				e=mid;
		}
		cout<<s<<endl;
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...