Cod sursa(job #1255046)

Utilizator irimiecIrimie Catalin irimiec Data 4 noiembrie 2014 10:34:56
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

const int DIM = 100010;
int n, m, pos, val, minim, start, stop, arb[4*DIM+100];

void update(int nod, int l, int r)
{
    if(l == r)
    {
        arb[nod] = val;
        return;
    }

    int mid = (l + r)/2;
    if(pos <= mid)
        update(2 * nod, l, mid);
    else
        update(2 * nod + 1, mid + 1, r);

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

void query(int nod, int l, int r)
{
    int mid;

    if(l >= start && r <= stop)
    {
        if(arb[nod] < minim)
            minim = arb[nod];
        return;
    }

    mid = l + (r - l) / 2;
    if(start <= mid)
        query(2 * nod, l, mid);
    if(mid < stop)
        query(2 * nod + 1, mid + 1, r);
}

void read()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        f >> val;
        pos = i;
        update(1, 1, n);
    }
}

void debug()
{
    for(int i = 1; i < 2 * n; ++i)
        cout << arb[i] << " ";
}

int main()
{
    read();

    for(int i = 1; i <= m; ++i)
    {
        f >> start >> stop;
        minim = 100010;
        query(1, 1, n);
        g << minim << '\n';
    }

    //debug();
}