Cod sursa(job #1138746)

Utilizator thebest001Neagu Rares Florian thebest001 Data 10 martie 2014 15:51:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#define MAX 100001
using namespace std;

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

int v[MAX];
int rmq[MAX][17];
int lg[MAX];
int main() {
    int n, m;

    in>>n>>m;
    for (int i = 1; i <= n; i++) {
        in>>v[i];
        rmq[i][0] = v[i];
    }
    int piutere = 1, cate = 0;
    for (int i = 1; i <= n; i++) {
        while (piutere * 2 <= i){
            piutere *= 2;
            cate++;
        }
        lg[i] = cate;
        for (int j = 1; 1<<j <= i; j++) {
            int a = rmq[i - (1<<(j - 1))][j - 1];
            int b = rmq[i][j - 1];
            rmq[i][j] = a < b ? a : b;
        }
    }
    int a, b;
    for (int i = 1; i <= m; i++) {
        in>>a>>b;
        int p2 = lg[b - a + 1];
        int A = rmq[a + (1<<p2) - 1][p2];
        int B = rmq[b][p2];
        int r = A < B ? A : B;
        out<<r<<"\n";
    }
    /* afisare
    for (int i = 1; i <= 16; i++) {
        printf("%d ",lg[i]);
    }
    printf("\n");

    for (int i = 0; i <= 16; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%3d ",rmq[j][i]);
        }
        printf("\n");
    }*/
    return 0;
}