Cod sursa(job #2032712)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 5 octombrie 2017 16:49:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

using namespace std;

FILE *in,*out;

const int nmax = 100000;
const int logmax = 18;

int rmq[logmax][1+nmax];
int lg[1+nmax];

int n,m;

void precompute()
{
    for(int i = 2;i <= n;i ++)
        lg[i] = lg[i >> 1] + 1;
}

int min(int a,int b)
{
    if(a < b)
        return a;
    return b;
}

int main()
{
    in = fopen("rmq.in","r");
    out = fopen("rmq.out","w");
    fscanf(in,"%d %d",&n,&m);
    precompute();
    for(int i = 1;i <= n;i ++)
        fscanf(in,"%d",&rmq[0][i]);
    for(int i = 1;i <= lg[n];i ++){
        for(int j = 1;j <= n;j ++){
            rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j + (1 << (i-1))]);
            //printf("leng = %d poz = %d rmq = %d\n",i,j,rmq[i][j]);
        }
    }
    for(int i = 1;i <= m;i ++)
    {
        int x,y;
        fscanf(in,"%d %d",&x,&y);
        int curr = lg[y-x];
        fprintf(out,"%d\n",min(rmq[curr][x],rmq[curr][y - (1 << curr) + 1]));
    }
    return 0;
}