Cod sursa(job #1742979)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 17 august 2016 13:43:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<stdio.h>
using namespace std;
FILE *f1=fopen("rmq.in","r");
FILE *f2=fopen("rmq.out","w");
int n,m,minim[20][100001],i,a,b,v[100001],k,j,log[100001],l;
int main(){
    fscanf(f1,"%d%d",&n,&m);
    for (i=1;i<=n;i++){
        fscanf(f1,"%d",&v[i]);
        minim[0][i]=i;
    }
    log[1]=0;
    for (i=2;i<=n;i++)
        log[i]=log[i/2]+1;
    for (j=1;(1<<j)<=n;j++){
        i=1;l=1<<(j-1);
        while(i+2*l<=n){
            if (v[minim[j-1][i]]<v[minim[j-1][i+l]]) minim[j][i]=minim[j-1][i];
               else
                minim[j][i]=minim[j-1][i+l];
            i++;
        }
    }
    for (i=1;i<=m;i++){
        fscanf(f1,"%d%d",&a,&b);
        k=log[b-a+1];l=1<<k;
        if (v[minim[k][a]]<v[minim[k][b-l+1]]) fprintf(f2,"%d\n",v[minim[k][a]]);
           else
            fprintf(f2,"%d\n",v[minim[k][b-l+1]]);
    }
    fclose(f1);
    fclose(f2);
    return 0;
}