Cod sursa(job #3326897)

Utilizator zionlyismAdobroaiei David zionlyism Data 1 decembrie 2025 10:10:59
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

#define NMAX 100002
using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

int n, a[NMAX], m;
int rmq[NMAX][20];

int main()
{
    int i, exp, power;
    fin>>n>>m;
    //citire si precalculare pt lungime 1
    for(i = 1; i <= n; i++) {fin>>a[i]; rmq[i][0] = a[i];}
    //rmq
    for(power = 2, exp = 1; power <= n; power *= 2, exp++) //power = puterea efectiva; j = exponentul pentru care se atinge puterea
        for(i = 1; i + power - 1 <= n; i++)
            rmq[i][exp] = min(rmq[i][exp - 1], rmq[i + power / 2][exp - 1]);
    //querry-urile
    int l, r, lgsecv; //indicii care imi indica secventa a carui minim trebuie afisata
    for(i = 1; i <= m; i++)
    {
        fin>>l>>r;
        lgsecv = r - l + 1;
        //calculeaza putere maxima care incape
        power = 1; exp = 0;
        while(power <= lgsecv) {power *= 2; exp++;}
        power /= 2; exp--;
        fout<<min(rmq[l][exp], rmq[r - power + 1][exp])<<'\n';
    }
    return 0;
}