Submission #1300434

#TimeUsernameProblemLanguageResultExecution timeMemory
1300434gustavovhgIndex (COCI21_index)C++20
20 / 110
2593 ms1496 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...