Cod sursa(job #1896600)

Utilizator ancabdBadiu Anca ancabd Data 28 februarie 2017 19:39:29
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

#define NMAX 100001
int n, a[NMAX], m, arb[4*NMAX];

void update(int st, int dr, int poz, int nod)
{
    if(st == dr)
    {
        arb[nod] = a[poz];
        return;
    }

    int mid = ((st+dr)>>1);

    if(mid >= poz)
        update(st, mid, poz, (nod<<1));
    if(mid < poz)
        update(mid+1, dr, poz, (nod<<1)+1);

    arb[nod] = min(arb[nod<<1], arb[(nod<<1)+1]);
}

int query(int st, int dr, int st1, int dr1, int nod)
{
    if(st == st1 && dr == dr1)
        return arb[nod];

    int mid = (st+dr)/2;

    if(mid >= dr1)
        return query(st, mid, st1, dr1, (nod<<1));

    if(mid < st1)
        return query(mid+1, dr, st1, dr1, (nod<<1)+1);

    return min(query(st, mid, st1, mid, (nod<<1)), query(mid+1, dr, mid+1, dr1, (nod<<1)+1));
}

int main()
{
    memset(arb, 10000000, NMAX * 4);

    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        fin >> a[i];
        update(1,n,i,1);
    }

    int x, y;
    for (int i = 1; i <= m; i++)
    {
        fin >> x >> y;
        fout << query(1, n, x, y, 1) << "\n";
    }
    return 0;
}