#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
const int TAM_BLOCO = 450;
int citacoes[MAXN];
int frequencia[MAXN];
int respostas[MAXN];
int esquerda[MAXN];
int direita[MAXN];
int idConsulta[MAXN];
int inicio = 1;
int fim = 0;
void adicionar(int posicao) {
frequencia[citacoes[posicao]]++;
}
void remover(int posicao) {
frequencia[citacoes[posicao]]--;
}
int calcularH() {
int soma = 0;
for (int h = 200000; h >= 1; h--) {
soma += frequencia[h];
if (soma >= h) {
return h;
}
}
return 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> citacoes[i];
}
for (int i = 0; i < q; i++) {
cin >> esquerda[i] >> direita[i];
idConsulta[i] = i;
}
sort(idConsulta, idConsulta + q, [&](int a, int b) {
if (esquerda[a] / TAM_BLOCO != esquerda[b] / TAM_BLOCO) {
return esquerda[a] / TAM_BLOCO < esquerda[b] / TAM_BLOCO;
}
if ((esquerda[a] / TAM_BLOCO) % 2 == 1) {
return direita[a] < direita[b];
} else {
return direita[a] > direita[b];
}
});
for (int i = 0; i < q; i++) {
int id = idConsulta[i];
while (fim < direita[id]) {
adicionar(++fim);
}
while (inicio > esquerda[id]) {
adicionar(--inicio);
}
while (fim > direita[id]) {
remover(fim--);
}
while (inicio < esquerda[id]) {
remover(inicio++);
}
respostas[id] = calcularH();
}
for (int i = 0; i < q; i++) {
cout << respostas[i] << "\n";
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |