Cod sursa(job #1393871)

Utilizator koroalinAlin Corodescu koroalin Data 19 martie 2015 20:13:16
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#define NMAX 100005
#define INF 1<<30
using namespace std;
FILE* fin=fopen("rmq.in","r");
FILE* fout=fopen("rmq.out","w");
int rmq[NMAX][32],t[NMAX],n,m,log2[NMAX];
int query(int st,int dr);
int minim(int a,int b)
{
    if (a<b) return a; return b;
}
int main()
{
    int i,j,a,b,logn=0,x=1,L;
    fscanf(fin,"%d %d",&n,&m);
    for (i=1; i<=n; i++)
    {
        fscanf(fin,"%d",&t[i]);
        rmq[i][0]=t[i];
    }
    for (j=1; (1<<j)<=n; j++)
        for (i=1; i<=n-(1<<j)+1; i++)
        {
            L=(1<<(j-1));
            rmq[i][j]=minim(rmq[i][j-1],rmq[i+L][j-1]);
        }

    for (i=1; i<=m; i++)
    {
        fscanf(fin,"%d %d",&a,&b);
        fprintf(fout,"%d\n",query(a,b));
    }

    return 0;
}
void logaritm()
{
    int i;
    for(i=2;i<=n;++i)
        log2[i]=log2[i/2]+1;
}
int query(int st,int dr)
{
    int i,nr,L,l;
    nr=dr-st+1;
    L=log2[nr];
    l=nr-(1<<L);
    return minim(rmq[st][L], rmq[st+l][L]);
}