Cod sursa(job #2755111)

Utilizator DalmatianuSebikSebastian Ionel DalmatianuSebik Data 26 mai 2021 19:42:48
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
using namespace std;

// idee: sparse table, imparti in doua intervalul [stanga, dreapta], faci minimele pe amandoua

const int maxim = 100002, logaritm = 18;
int vec[maxim];
int matrice[maxim][logaritm];
int bin_log[maxim];

int coada(int stanga, int dreapta)
{
    int lungime = dreapta - stanga + 1, loga = bin_log[lungime];
    return min(matrice[stanga][loga], matrice[dreapta - (1 << loga) + 1][loga]);
}

int main()
{
    int n, m, x, y;
    ifstream f("rmq.in");
    ofstream o("rmq.out");

    //Citire
    f >> n >> m;

    for(int i = 0; i < n; i++){
        f >> vec[i];
        matrice[i][0] = vec[i];
    }



    for(int i = 2; i <= n; i++){
        // fac logaritmi
        bin_log[i] = bin_log[i / 2] + 1;
    }
    for(int j = 1; j < logaritm; j++){
        for(int i = 0; i + (1 << j) - 1 < n; i++){
            matrice[i][j] = min(matrice[i][j - 1], matrice[i + (1 << (j - 1))][j - 1]);
        }
    }

    for(int i = 0; i < m; i++){
        f >> x >> y;
        o << coada(x - 1, y - 1) << '\n'; // indexat de la 1
    }

    return 0;
}