Cod sursa(job #384613)

Utilizator cristikIvan Cristian cristik Data 20 ianuarie 2010 15:47:23
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#define maxn 100010
#define left (nod<<1)
#define right ((nod<<1)|1)
#define mid ((st+dr)>>1)
int min(int a,int b) { if(a<b) return a; return b; }
int max(int a,int b) { if(a>b) return a; return b; }
int arb[4*maxn],n,m,i,val,pos,start,finish,p;
void update(int nod,int st,int dr)
{
    if(st==dr) { arb[nod]=val; return; }

    if(pos<=mid) update(left,st,mid);
    if(pos>mid)  update(right,mid+1,dr);

    arb[nod]=min(arb[left],arb[right]);
}
void query(int nod,int st,int dr)
{
    if(start<=st && dr<=finish)
    {
        if(p>arb[nod]) p=arb[nod];
        return;
    }
    if(start<=mid) query(left,st,mid);
    if(finish>mid) query(right,mid+1,dr);
}
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++) { pos=i; scanf("%d",&val); update(1,1,n); }
    for(; m>0; m--)
    {
        scanf("%d%d",&start,&finish);
        p=maxn; query(1,1,n);
        printf("%d\n",p);
    }
    return 0;
}