Cod sursa(job #1679640)

Utilizator Matei_IgnutaMatei Ignuta Matei_Ignuta Data 8 aprilie 2016 09:37:24
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>

using namespace std;

#define max 100002
#define lmax 18

int rmq[lmax][max];
int n, m;
int log[max];
int a[max];
int min(int a, int b){
    if(a<b) return a;
    return b;
    }
int main(){
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int l;

    scanf("%d %d", &n, &m);

    for(int i=1; i<=n; i++)
        scanf("%d", &a[i]);
    log[1]=0;
    for(int i=2; i<=n; i++)
        log[i]=1+log[i/2];
    for(int i=1; i<=n; i++)
        rmq[0][i]=a[i];
    for(int i=1; (1 << i) <= n; i++)
        for(int j=1; j <= n-(1<<i)+l; j++)
            {
                l=1<<(i-1);
                rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+l]);
            }
    int x, y, d, shift;
    for(int i=1; i<=m; i++)
        {
            scanf("%d %d", &x, &y);
            d=y-x+1;
            l=log[d];
            shift=d-(1<<l);
            printf("%d\n", min(rmq[l][x], rmq[l][shift+x]));
        }
    return 0;
}