Cod sursa(job #2495067)

Utilizator AnduebossAlexandru Ariton Andueboss Data 18 noiembrie 2019 20:27:43
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
//
//  main.cpp
//  RMQ
//
//  Created by Andu Andu on 18/11/2019.
//  Copyright © 2019 Andu Andu. All rights reserved.
//

#include <fstream>
#include <queue>
#include <vector>
#define H 20
#define I 100000
using namespace std;
ifstream cin ("rmq.in");
ofstream cout ("rmq.out");

int rmq[H][I], n;

int min (int y, int x) {
    if (x <= y) return x;
    return y;
}
int logg[100000];
void makelog() {
    int i = 0;
    for(i=2; i<=n; i*=2) logg[i]++;
    for(i=1; i<=n; i++) logg[i]+=logg[i-1];
}
int log(int i) {
    return logg[i];
}

int pow(int baza, int exponent) {
    int b = 1;
    for (int i=1;i<=exponent;i++) {
        b *= baza;
        
    }
    return b;
}

int getRMQof ( int x, int y, int h ) {
    int rasp;
    rasp = min (rmq[h][x], rmq[h][y - pow(2, h) + 1]);
    return rasp;
}
int vek[1000],m;
int main(int argc, const char * argv[]) {
    // insert code here...
    cin>>n>>m;
    makelog();
    for(int i=1;i<=n;i++) {
        cin>>vek[i];
    }
    for (int i=1;i<=n;i++)
        rmq[0][i] = vek[i];
    for (int h=1;h<=log(n);h++) {
        for (int i=1;i<=n-pow(2, h)+1;i++) {
            rmq[h][i] = min(rmq[h-1][i], rmq[h-1][i+pow(2, h-1)]); // rmq[h][i]=min(rmq[h-1][i],rmq[h-1][i+2^(h-1)])
        }
        
    }
    
    for (int h=1;h<=m;h++) {
        int x,y;
        cin>>x>>y;
        cout << getRMQof(x, y, 1) <<"\n";
    }
    
    // cout << "Hello, World!\n";
    return 0;
}