Cod sursa(job #2164798)

Utilizator KemyKoTeo Virghi KemyKo Data 13 martie 2018 09:51:28
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 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];

void preCalcul()
{
    int i, j;

    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];
}

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

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

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

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

    preCalcul();

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


    return 0;
}