Cod sursa(job #2480964)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 26 octombrie 2019 11:59:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <iostream>
#include <cstdio>
#define LOG_MAX 17
#define NMAX 100001
using namespace std;
int r[LOG_MAX][NMAX],log[NMAX];
int minim(int a, int b){
    return a < b ? a : b;
}
int rmq(int x, int y){
    int length = y-x+1;
    int exp = log[length];
    return minim(r[exp][x],r[exp][y-(1<<exp)+1]);
}
int main()
{
    FILE *fin, *fout;
    int n,q,x,y,i,j;
    fin = fopen("rmq.in","r");
    fout = fopen("rmq.out","w");
    fscanf(fin,"%d %d",&n,&q);
    for(j=0;j<n;j++)
        fscanf(fin,"%d",&r[0][j]);
    log[1] = 0;
    for(i=2;i<=n;i++)
        log[i] = 1+log[i/2];
    for(i=1;i<=log[n];i++)
        for(j=0;j+(1<<i)-1<n;j++)
            r[i][j] = minim(r[i-1][j],r[i-1][j+(1<<(i-1))]);
    while(q--){
        fscanf(fin,"%d %d",&x,&y);
        fprintf(fout,"%d\n",rmq(x-1,y-1));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}