Cod sursa(job #822629)

Utilizator ciorile.chioareBogatu Adrian ciorile.chioare Data 23 noiembrie 2012 20:42:32
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<cstdio>

#define N_MAX 100002

int *arbint;

FILE* in;
FILE* out;

int flog(int n)
{
        if(n == 1)
                return 0;
        return 1 + flog(n >> 1);
}

int log(int n)
{
        return flog((n - 1)) + 1;
}

int max(int a, int b)
{
        return (a < b)?b:a;
}

int min(int a, int b)
{
        return (a < b)?a:b;
}

int update(int pos, int x)
{
        arbint[pos] = x;
        while(pos) {
                pos = (pos - 1) / 2;
                arbint[pos] = min(arbint[2 * pos + 1], arbint[2 * pos + 2]);
        }
}

int find(int root, int a, int b, int l, int r)
{
        if((a <= l) && (b <= r))
                return arbint[root];

        int mid = (l + r) / 2;
        if(b <= mid)
                return find(2 * root + 1, a, b, l, mid);
        else if(mid < a)
                return find(2 * root + 2, a, b, mid + 1, r);
        else
                return min(find(2 * root + 1, a, mid, l, mid), 
                                find(2 * root + 2, mid + 1, b, mid + 1,r));
}

int main()
{
        in = fopen("rmq.in", "r");
        out = fopen("rmq.out", "w");

        int n, m;
        int *A;

        fscanf(in, "%d%d", &n, &m);

        A = new int[n];
        int rn = 1 << log(n);
        arbint = new int[2 * rn];
        for(int i = 0; i < 2 * rn; ++i)
                arbint[i] = N_MAX;

        for(int i = 0; i < n; ++i) {
                fscanf(in, "%d", A + i);
                update(rn - 1 + i, A[i]);
        }

        int a, b;
        for(int i = 0; i < m; ++i) {
                fscanf(in, "%d%d", &a, &b);
                fprintf(out, "%d\n", find(0, a - 1, b - 1, 0, rn - 1));
        }

        return 0;
}