Submission #1345507

#TimeUsernameProblemLanguageResultExecution timeMemory
1345507Jawad_Akbar_JJIndex (COCI21_index)C++20
110 / 110
253 ms25220 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<18;
vector<int> Mid[N];
vector<pair<int, int>> vec;
int ft[N], l[N], r[N], L[N], R[N];

void Add(int i, int v){
	for (; i < N; i += i & -i)
		ft[i]++;
}

int get(int i, int ans = 0){
	for (; i; i -=  i & -i)
		ans += ft[i];
	return ans;
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, q;
	cin>>n>>q;

	for (int i=1, a;i<=n;i++){
		cin>>a;
		vec.push_back({min(a, n), i});
	}

	sort(begin(vec), end(vec));


	for (int i=1;i<=q;i++){
		cin>>l[i]>>r[i];
		L[i] = 1, R[i] = n+1;
		Mid[(n + 2) / 2].push_back(i);
	}

	for (int j=1;j<=20;j++){
		for (int i=n, s = vec.size()-1;i>=1;i--){
			while (s >= 0 and vec[s].first == i)
				Add(vec[s--].second, 1);

			for (int k : Mid[i]){

				if (get(r[k]) - get(l[k]-1) >= i)
					L[k] = i;
				else
					R[k] = i;
			}
			Mid[i].clear();
		}
		for (int i=1;i<N;i++){
			ft[i] = 0;
			if (i <= q and L[i] + 1 < R[i])
				Mid[(L[i] + R[i]) / 2].push_back(i);
		}
	}

	for (int i=1;i<=q;i++)
		cout<<L[i]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...