Cod sursa(job #1994885)

Utilizator rares1012Rares Cautis rares1012 Data 26 iunie 2017 14:43:14
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.76 kb
#include <stdio.h>
#include <stdlib.h>

int v[100000][17];

int log[100001];

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

int main()
{
    int n,q,i,k,a,b,p;
    FILE*fi,*fo;
    fi=fopen("rmq.in","r");
    fo=fopen("rmq.out","w");
    fscanf(fi,"%d%d",&n,&q);
    for(i=0;i<n;i++)
    {
        fscanf(fi,"%d",&v[i][0]);
        for(k=1;(1<<k)<i+2;k++)
        {
            v[i][k]=min(v[i-(1<<(k-1))][k-1],v[i][k-1]);
        }
    }
    for(i=2;i<=100000;i++)
        log[i]=1+log[i/2];
    for(i=0;i<q;i++){
        fscanf(fi,"%d%d",&a,&b);
        a--;
        b--;
        p=log[b-a];
        fprintf(fo,"%d\n",min(v[a+(1<<p)-1][p],v[b][p]));
    }
    fclose(fi);
    fclose(fo);
    return 0;
}