Cod sursa(job #703666)

Utilizator AplayLazar Laurentiu Aplay Data 2 martie 2012 13:34:13
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<stdio.h>
int log2[100100],M[21][100010],n,m;
FILE *f=fopen("rmq.in","r");

void citire()
{
    fscanf(f,"%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        fscanf(f,"%d",&M[0][i]);
}

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

void matrice()
{
    log2[0]=log2[1]= 0;
    for(int i=2;i<=n;++i)
        log2[i] = log2[ i >> 1] + 1;
    for(int i=1;(1<<i) <= n; ++i)
        for(int j=1; j+(1<<(i-1)) <= n; ++j)
            M[i][j] = minim ( M[i-1][j], M[i-1][j + (1<<(i-1))] );
}

int main()
{
    citire();
    int x,y,L;
    FILE *g=fopen("rmq.out","w");
    matrice();
    for(int i=1;i<=m;++i)
    {
        fscanf(f,"%d%d",&x,&y);
        L = log2[y-x+1];
        fprintf(g,"%d\n",minim(M[L][x],M[L][y - (1<<L) +1]));
    }
    fclose(f);
    fclose(g);
    return 0;
}