Cod sursa(job #1489549)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 21 septembrie 2015 16:09:12
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <cmath>
using namespace std;

const int maxN = 100000;

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

    for (i = 1; i <= (int)log(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, int 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];
    int dp[(int)log(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();
}