Cod sursa(job #548183)

Utilizator SadmannCornigeanu Calin Sadmann Data 7 martie 2011 10:05:22
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#define NMAX 100005

inline int minim(int a,int b)
{
    if(a<b)
        return a;
    return b;
}

void Update(int,int,int);
void Check(int,int,int);

FILE *in,*out;
int poz,i,val,minArb[4*NMAX],n,m,start,finish,min;
int main()
{
    in=fopen("rmq.in","rt");
    out=fopen("rmq.out","wt");
    fscanf(in,"%d %d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&val);
        poz=i;
        Update(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
        min=100001;
        fscanf(in,"%d %d",&start,&finish);
        Check(1,1,n);
        fprintf(out,"%d\n",min);
    }

    return 0;
}

void Update(int nod,int left,int right)
{
    if(left==right)
    {
        minArb[nod]=val;
        return;
    }
    int div=(left+right)>>1;
    if(poz<=div)
        Update(nod<<1,left,div);
    else
        Update((nod<<1)+1,div+1,right);
    minArb[nod]=minim(minArb[nod<<1],minArb[(nod<<1)+1]);
}

void Check(int nod,int left,int right)
{
    if(start<=left && finish>=right)
    {
        if(min>minArb[nod])
            min=minArb[nod];
        return;
    }
    int div=(left+right)>>1;
    if(start<=div)
        Check(nod<<1,left,div);
    if(finish>div)
        Check((nod<<1)+1,div+1,right);

}