Cod sursa(job #955591)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 1 iunie 2013 09:54:34
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>
#include<algorithm>

#define NMAX 100001

using namespace std;

int Arbi[NMAX * 3];
int x , y , a , poz , Ans , n , m;

void update(int nod , int st , int dr)
{
    if(st == dr)
    {
        Arbi[nod] = a;
        return ;
    }
    int med = (st + dr) >> 1;
    if(med >= poz)
        update(2 * nod , st , med);
    else
        update(2 * nod + 1 , med + 1 , dr);
    Arbi[nod] = min(Arbi[nod * 2] , Arbi[nod * 2 + 1]);
}

void query(int nod , int st , int dr)
{
    if(st >= x && dr <= y)
    {
        Ans = min(Ans , Arbi[nod]);
        return ;
    }
    int med = (st + dr) >> 1;
    if(x <= med)
        query(2 * nod , st , med);
    if(y > med)
        query(2 * nod + 1 , med + 1 , dr);
}

int main()
{
    freopen("rmq.in" , "r" , stdin);
    freopen("rmq.out" , "w" , stdout);
    scanf("%d %d" , &n , &m);
    for(int i = 1 ; i <= n ; ++ i)
    {
        scanf("%d" , &a);
        poz = i;
        update(1 , 1 , n);
    }
    for(int i = 1 ; i <= m ; ++ i)
    {
        scanf("%d %d" , &x , &y);
        Ans = 20000000;
        query(1 , 1 , n);
        printf("%d\n" , Ans);
    }
    return 0;
}