Cod sursa(job #2625322)

Utilizator killerdonuts358nicolae tudor killerdonuts358 Data 5 iunie 2020 21:22:45
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <algorithm>
#include <cmath>
#include <fstream>
using namespace std;

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

int A[100001];
int RMQ[100001][18];

void preCalculation(unsigned n)
{

    for(int i = 0; i < n; i++)
        RMQ[i][0]=i;

    for(unsigned j = 1; 1u << j <= n; j++)
        for(unsigned i = 0; i + (1u<<j) - 1 < n; i++)
            if(A[RMQ[i][j - 1]] < A[RMQ[i + (1u << (j - 1))][j - 1]])
                RMQ[i][j] = RMQ[i][j - 1];
            else
                RMQ[i][j] = RMQ[i + (1u << (j - 1))][j - 1];

}

int minim(int x, int y)
{
    unsigned logLength = log2(y - x + 1);

    if(A[RMQ[x][logLength]] < A[RMQ[y - (1u << logLength) + 1][logLength]])
        return A[RMQ[x][logLength]];
    return A[RMQ[y - (1u << logLength) + 1][logLength]];

}

int main()
{
    int n, m;
    in >> n >> m;
    for(int i = 0; i < n; i++)
        in >> A[i];

    preCalculation(n);
    int x, y;
    for(int i = 0;i < m; i++)
    {
        in >> x >> y;
        out << minim(x - 1,y - 1)<<"\n";
    }
    
    return 0;
}