Cod sursa(job #1742966)

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