Cod sursa(job #3130440)

Utilizator TirilaPatricTirila Patric-Gabriel TirilaPatric Data 17 mai 2023 19:52:01
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int rmq[100003][17];

int find(int a[], int left, int right, int l, int k){
    int p = pow(2, k);
    if (a[rmq[left][k]] <= a[rmq[left + l - p][k]]) {
        return a[rmq[left][k]];
    } else {
        return a[rmq[right - p + 1][k]];
    }
}
int main(){
    ifstream f("rmq.in");
    ofstream g("rmq.out");


    int n, m;
    f>>n>>m;
    int a[n], i = 0, l = log(n);

    while(i<n){
        f>>a[i++];
    }

    for (int i = 0; i < n; i++) {
        rmq[i][0] = i;
    }

    for (int j = 1; pow(2, j) <= n; j++) {
        int p = pow(2, j-1);
        for (int i = 0; i + p*2 - 1 < n; i++) {
            if (a[rmq[i][j - 1]] < a[rmq[i + p][j - 1]]) {
                rmq[i][j] = rmq[i][j - 1];
            } else {
                rmq[i][j] = rmq[i + p][j - 1];
            }
        }
    }

    int b, c;
    while(m>0){
        f>>b>>c;
        b--; c--;
        int l = c-b+1, k = log(c-b+1);
        g<<find(a, b, c, l, k)<<endl;
        m--;
    }


    f.close();
    g.close();

    return 0;
}