Cod sursa(job #1489557)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 21 septembrie 2015 16:35:20
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <cmath>
#include <cassert>
#include <iostream>
using namespace std;

const int maxN = 100000;

void process(int a[], short dp[][maxN], int N)
{
    int i, j;
    for (i = 0; i < N; i++)
        dp[0][i] = a[i];

    for (i = 1; i <= (int)(log2(N)); i++)
        for (j = 0; j + (1 << (i - 1)) < N; j++)
            dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
}

int query(int x, int y, short dp[][maxN], int N)
{
    int k = 0;
    x--, y--;
    while ((1 << (k + 1)) <= (y - x))
        k++;
    return min(dp[k][x], dp[k][y - (1 << k) + 1]);
}

int main()
{
    int N, M, i;
    ifstream f("rmq.in");
    f >> N >> M;
    int a[N];
    for (i = 0; i < N; i++)
        f >> a[i];
    short dp[(int)(log2(N)) + 1][maxN];
    process(a, dp, N);
    int x, y;
    ofstream g("rmq.out");
    for (i = 0; i < M; i++)
    {
        f >> x >> y;
        g << query(x, y, dp, N) << '\n';
    }
    f.close();
    g.close();
}