Cod sursa(job #2292649)

Utilizator dia.ionescuIonescu Diana dia.ionescu Data 29 noiembrie 2018 19:34:04
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#include <math.h>

using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
int putere(int exp) {
    int x = 1 << exp;
    return x;
}
int a[100002][17];
int main()
{
    vector<int> v;
    vector< pair<int, int> > queries;
    int N, M, x, y, ln;
    fin >> N >> M;
    for (int i = 0; i < N; i++) {
        fin >> x;
        v.push_back(x);
    }

    for (int i = 0; i < M; i++) {
        fin >> x >> y;
        queries.push_back(make_pair(x, y));
    }

    for (int i = 0; i < N - 1; i++) {
       a[i][0] = min(v[i], v[i + 1]);
    }
    ln = log2(N);
    for (int j = 1; j <= ln; j++) {
        for (int i = 0 ; i < (N - putere(j)); i++) {
            a[i][j] = min(a[i][j - 1], a[putere(j - 1) + i][j - 1]);
        }
    }
    for (int i = 0; i < M; i++) {
            int f, l, k;
            f = queries[i].first - 1;
            l = queries[i].second - 1;
            k = log2(l - f);
            fout <<  min(a[f][k], a[l- putere(k)][k])  << endl;
    }
    return 0;
}