Cod sursa(job #3261356)

Utilizator M132M132 M132 M132 Data 5 decembrie 2024 16:26:55
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100000;
int v[NMAX + 5], n, logaritm[NMAX + 5], mat[NMAX + 5][20];

void precalc_log()
{
    int i;
    logaritm[1] = 0;
    for(i = 2; i <= n; ++i)
    {
        logaritm[i] = 1 + logaritm[i/2];
    }
}

void precalc_matrice()
{
    int L = logaritm[n];
    int i, j;
    for(i = 1; i <= n; ++i)
    {
        mat[i][0] = v[i];
    }
    for(i = 1; i <= L; ++i)
    {
        for(j = 1; j <= n; ++j)
        {
            if(j + (1 << (i - 1)) - 1 <= n)
            {
                mat[j][i] = min(mat[j][i-1], mat[j + (1 << (i-1))][i-1]);
            }
            else
            {
                mat[j][i] = mat[j][i-1];
            }
        }
    }
}

int q(int x, int y)
{
    ///elem minim din [x, y]
    int rez, L;
    L = logaritm[y - x + 1];
    rez = min(mat[x][L], mat[y - L][L]);
    return rez;
}

int main()
{
    int m, i, x, y;
    f >> n >> m;
    for(i = 1; i <= n; ++i)
    {
        f >> v[i];
    }
    precalc_log();
    precalc_matrice();
    for(i = 1; i <= m; ++i)
    {
        f >> x >> y;
        g << q(x, y) << "\n";
    }
    return 0;
}