Cod sursa(job #384617)

Utilizator cristikIvan Cristian cristik Data 20 ianuarie 2010 15:54:49
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#define maxn 100010
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; }
    int mid=(st+dr)>>1;
    if(i<=mid) update(nod<<1,st,mid);
    if(i>mid)  update((nod<<1)|1,mid+1,dr);

    arb[nod]=min(arb[nod<<1],arb[(nod<<1)|1]);
}
void query(int nod,int st,int dr)
{
    if(start<=st && dr<=finish)
    {
        if(p>arb[nod]) p=arb[nod];
        return;
    }
    int mid=(st+dr)>>1;
    if(start<=mid) query(nod<<1,st,mid);
    if(finish>mid) query((nod<<1)|1,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++) {  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;
}