Cod sursa(job #2619706)

Utilizator FLORENTIN-GIULIANO.DUMITRUDumitru Florentin Giuliano FLORENTIN-GIULIANO.DUMITRU Data 28 mai 2020 12:51:40
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <cmath>
#include <unordered_map>
#include <iostream>

std::ifstream in("rmq.in");
std::ofstream out("rmq.out");
#define MAX 10000

int lookup[MAX][MAX];

struct Query
{
    int L, R;
};

void preprocess(int arr[], int n)
{
    for (int i = 0; i < n; i++)
        lookup[i][0] = i;
    for (int j=1; (1<<j)<=n; j++)
    {
        for (int i=0; (i+(1<<j)-1) < n; i++)
        {
            if (arr[lookup[i][j-1]] < arr[lookup[i + (1<<(j-1))][j-1]])
                lookup[i][j] = lookup[i][j-1];
            else
                lookup[i][j] = lookup[i + (1 << (j-1))][j-1];
        }
    }
}

int query(int arr[], int L, int R)
{
    int j = (int)log2(R-L+1);
    if (arr[lookup[L][j]] <= arr[lookup[R - (1<<j) + 1][j]])
        return arr[lookup[L][j]];

    else return arr[lookup[R - (1<<j) + 1][j]];
}
void RMQ(int arr[], int n, Query q[], int m)
{
    preprocess(arr, n);
    for (int i=0; i<m; i++)
    {
        int L = q[i].L, R = q[i].R;
        out << query(arr, L-1, R-1) << "\n";
    }
}

int main()
{
    int n, m;
    in >> n >> m;
    int a[n];
    Query b[m];
    for (int i = 0; i < n; i ++)
        in >> a[i];
    for (int j = 0; j < m; j ++)
        in >> b[j].L >> b[j].R;
    RMQ(a,n,b,m);
    return 0;
}