Cod sursa(job #2368320)

Utilizator KemyKoTeo Virghi KemyKo Data 5 martie 2019 15:29:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#define NMAX 100001

using namespace std;

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

int n, m;
vector <int> v;
int M[NMAX][20];

int query(int x, int y)
{
    int k = log2(y - x + 1);

    if (v[M[x][k]] < v[M[y - (1<<k) + 1][k]])
        return v[M[x][k]];
    return v[M[y - (1<<k) + 1][k]];
}

int main()
{
    int i, j, x, y;
    f >> n >> m;

    v.push_back(0);
    for(i=1; i<=n; ++i) {
        f >> x;
        v.push_back(x);
        M[i][0] = i;
    }

    for(j=1; 1<<j <= n; ++j)
        for(i=1; i + (1<<j) - 1 <= n; ++i)
            if(v[M[i][j - 1]] < v[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];

    for(i=1; i<=m; ++i){
        f >> x >> y;
        g << query(x, y) << '\n';
    }

    return 0;
}