Cod sursa(job #2921714)

Utilizator tiut_cristianTiut Cristian tiut_cristian Data 1 septembrie 2022 15:20:50
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAXN = 100001;
const int LOGMAXN = 17;

int mat[MAXN][LOGMAXN], a[MAXN], n, m;

void citire(int & n, int & m, int a[])
{
    fin >> n >> m;
    for(int i = 0; i < n; i++)
        fin >> a[i];
}

void generare_matrice(int M[][LOGMAXN], int A[], int N)
{
    for (int i = 0; i < N; i++)
        M[i][0] = i;
    //M[i][j] is the index of the minimum value in the sub array starting at i having length 2^j
    for (int j = 1; 1 << j <= N; j++)
    {
        const int cN = N - (1 << j);
        for (int i = 0; i <= cN; i++)
            if (A[ M[i][j - 1] ] < A[ M[i + (1 << (j - 1))][j - 1] ])
                M[i][j] = M[i][j - 1];
            else
                M[i][j] = M[i + (1 << (j - 1))][j - 1];
    }
}

int main()
{
    citire(n, m, a);
    generare_matrice(mat, a, n);
    for(int i = 1; i <= m; i++)
    {
        int st, dr;
        fin >> st >> dr;
        int maxpower = (int)log2(dr-st+1);
        fout << min(a[ mat[st-1][maxpower] ], a[ mat[dr - (1 << maxpower)][maxpower] ]) << '\n';
    }
    return 0;
}