Cod sursa(job #978231)

Utilizator supermitelArdelean Razvan Mitel supermitel Data 28 iulie 2013 13:06:04
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct node
{
    node *st, *dr, *par;
    int ist, idr, m;
    node(int x = 0)
    {
        m = x;
    }
}*leaf[100010];

int n, m;
node *root;

void read()
{
    int aux, i;
    scanf("%d%d", &n, &m);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &aux);
        leaf[i] = new node(aux);
        leaf[i] -> ist = leaf[i] -> idr = i;
    }
}

int create(node * &p, int st, int dr, node *par = NULL)
{
    if(st == dr)
    {
        p = leaf[st];
        p -> par = par;
        return p -> m;
    }
    p = new node;
    p -> ist = st;
    p -> idr = dr;
    p -> par = par;
    int mij = (st+dr)/2;
    p -> m = min(create(p->st, st, mij, p), create(p->dr, mij+1, dr, p));
    return p -> m;
}

int getmin(node *p, int st, int dr)
{
    if(p -> idr < st || p -> ist > dr)
        return INFINITY;
    if(p -> ist >=st && p -> idr <= dr)
        return p -> m;
    return min(getmin(p -> st, st, dr), getmin(p->dr, st, dr));
}

void solve()
{
    int i, x, y, aux;
    for(i = 0; i< m; i++)
    {
        scanf("%d%d", &x, &y);
        aux = getmin(root, x-1, y-1);
        printf("%d\n", aux);
    }
}

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    read();
    create(root, 0, n-1);
    solve();
    return 0;
}