Cod sursa(job #2895915)

Utilizator mihairazvan03Dana Mihai mihairazvan03 Data 29 aprilie 2022 16:28:07
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

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

int v[100100], bucketMinPoz[100100][20], k, i, j, n, m, x, y, p; //retinem poz minimului din v in bucketul actual

void creeazaBucketuri()
{
    for(i = 0; i < n ; i++)
        bucketMinPoz[i][0] = i;

    for(j = 1; (1 << j) <= n; j++)
        for(i = 0; i + (1 << j) - 1 < n; i++)
            if(v[bucketMinPoz[i][j - 1]] < v[bucketMinPoz[i + (1 << (j - 1))][j - 1]])
                bucketMinPoz[i][j] = bucketMinPoz[i][j - 1];
            else
                bucketMinPoz[i][j] = bucketMinPoz[i + (1 << (j - 1))][j - 1];
}

int main()
{
    in>>n>>m;

    for(i = 0; i < n; i++)
        in>>v[i];

    creeazaBucketuri();

    for(i = 1; i <= m; i++)
    {
        in>>x>>y;

        p = 1;
        k = 0;
        while(p * 2 <= y - x + 1)      //k = log(j - i + 1)
        {
            p *= 2;
            k++;
        }

        if(v[bucketMinPoz[x - 1][k]] <= v[bucketMinPoz[y - p][k]])
            out<<v[bucketMinPoz[x - 1][k]]<<'\n';
        else
            out<<v[bucketMinPoz[y - p][k]]<<'\n';
    }

    return 0;
}