Cod sursa(job #2625742)

Utilizator antonioganea3Antonio Ganea antonioganea3 Data 6 iunie 2020 09:54:58
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <iostream>
#include <cmath>
using namespace std;

FILE * fin, * fout;

int v[1000005];
int rmq[18][1000005];

int main(){
    fin = fopen("rmq.in","r");
    fout = fopen("rmq.out","w");

    int N, M;
    fscanf(fin,"%d%d",&N,&M);

    for ( int i = 1; i <= N; i++ ){
        fscanf(fin,"%d",v+i);
        rmq[0][i] = v[i];
    }

    for (int i = 1; (1 << i) <= N; i++){
        for (int j = 1; j <= N - (1 << i) + 1; j++){
            int l = 1 << (i - 1);
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + l]);
        }
    }

    int x, y, d;

    for (long int i = 1; i <= M; i++) {
        fscanf(fin,"%d%d",&x,&y);
        d = y - x + 1;
        int l = (int)log2(d);
        d = d - (1 << l);
        fprintf(fout,"%d\n",min(rmq[l][x], rmq[l][x + d]));
    }

    fclose(fin);
    fclose(fout);
    return 0;
}