Cod sursa(job #1060098)

Utilizator impulseBagu Alexandru impulse Data 17 decembrie 2013 16:27:07
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.89 kb
//
//  main.c
//  rmq
//
//  Created by Alexandru Bâgu on 11/27/13.
//  Copyright (c) 2013 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>


int MIN( int a,  int b)
{
    if(a > b) return b;
    return a;
}

int tree_height(int elem_count)
{
    if(elem_count <= 1) return elem_count;
    return elem_count + tree_height(elem_count / 2);
}

int bin_height(int n)
{
    int i = 1;
    while (i < n) i <<= 1;
    return i;
}

int add(int elem, int index, int *T, int b_height)
{
    int l = 1, r = b_height;
    int mid, nod = 1;
    while(l != r)
    {
        mid = (l + r) / 2;
        if(mid >= index)
        {
            r = mid;
            nod *= 2;
        }
        else
        {
            l = mid + 1;
            nod = nod * 2 + 1;
        }
    }
    T[nod] = elem;
    while(nod > 0)
    {
        nod /= 2;
        T[nod] = MIN(T[nod * 2], T[nod * 2 + 1]);
    }
    return 0;
}

int do_query(int nod, int l, int r, int a, int b, int *T, int *max)
{
    if(l >= a && r <= b)
    {
        if(*max > T[nod]) *max = T[nod];
        return 0;
    }
    
    int mid = (l + r) / 2;
    if(mid < b) do_query(nod * 2 + 1, mid + 1, r, a, b, T, max);
    if(a < mid) do_query(nod * 2, l, mid, a, b, T, max);
    return 0;
}

int query(int a, int b, int *T, int b_h)
{
    int max = 0x7FFFFFFF;
    do_query(1, 1, b_h, a, b, T, &max);
    return max;
}


int main(int argc, const char * argv[])
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    
    int n, q;
    scanf("%d %d", &n, &q);
    
    int b_h = bin_height(n);
    int t_h = tree_height(b_h) + 1;
    int T[t_h], i;
    for(i = 0; i < t_h; i++)
        T[i] = 0x7FFFFFFF;
    for(i = 1; i <= n; i++)
    {
        int e;
        scanf("%d", &e);
        add(e, i, T, b_h);
    }
    int a, b;
    for(i = 0; i < q; i++)
    {
        scanf("%d %d", &a, &b);
        printf("%d\n", query(a, b, T, b_h));
    }
    return 0;
}