Cod sursa(job #2540240)

Utilizator mariusn01Marius Nicoli mariusn01 Data 6 februarie 2020 21:18:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <algorithm>
#define BAZA 256
using namespace std;
ifstream fin ("rmq.in");
ofstream fout("rmq.out");
/**
e = 0:  2 4 1 8 9 3 8 6 9
e = 1:  2 1 1 8 3 3 6 6 9
e = 2:  1 1 1 3 3 3 6 6 9
e = 3:  1 1 1 3 3 3 6 6 9
st = 4 si dr = 8  rasp 3
**/
int lg[100010];
int d[17][100010];
int e, i, j, n, q, st, dr;
int main () {

    /// se da un sir care ramane fix si asupra lui sunt doar interogari
    /// [st dr] cu semnificatia: care este minimul din intervalul de indici
    /// [st dr] inclusiv
    /// facem o precualculare: d[e][i] = minimul dintr-o secventa
    /// de lungime 2 la e care incepe la pozitia i

    fin>>n>>q;
    for (i=1;i<=n;i++)
        fin>>d[0][i];
    for (e = 1;(1<<e) <= n; e++) {
        for (i=1;i<=n;i++) {
            /// d[e][i]
            d[e][i] = d[e-1][i];
            j = i+ (1<<(e-1));
            if (  j  <= n  && d[e-1][j] < d[e][i])
                d[e][i] = d[e-1][j];
        }
    }
    /// avem precalcular la fiecare pozitie de inceput posibila
    /// minime pe toate secventele de lungime putere de 2 ce pornesc de acolo

    lg[1] = 0;
    for (i=2;i<=n;i++)
        lg[i] = lg[i/2]+1;
    /// lg[i] = exponentul primei puteri de 2 mai mare sau egale cu jumatatea lui i
    /// altfel spus al celei mai mari puteri de 2 mai mica sau egala cu i
    for (i=1;i<=q;i++) {
        fin>>st>>dr;
        e = lg[dr-st+1];
        fout<<min(d[e][st],  d[e][dr-(1<<e)+1] )<<"\n";
    }

    return 0;
}