Cod sursa(job #765528)

Utilizator igsifvevc avb igsi Data 8 iulie 2012 00:22:35
Problema Range minimum query Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>

FILE *in, *out;
long int intervalTree[262144], min, value;
int N, M, left, right, position;

void add(int l, int r, int pos)
{
    if(l == r)
        intervalTree[pos] = value;
    else
    {
        int middle = (r - l) / 2 + l;
        if(position <= middle)
            add(l, middle, pos << 1);
        else
            add(middle + 1, r, (pos << 1) + 1);

        if(intervalTree[pos] == 0 || intervalTree[pos] > value)
            intervalTree[pos] = value;
    }
}

void query(int l, int r, int pos)
{
    if(left <= l && r <= right)
    {
        if(intervalTree[pos] < min)
            min = intervalTree[pos];
    }
    else
    {
        int middle = (r - l) / 2 + l;
        if(left <= middle)
            query(l, middle, pos << 1);
        if(middle < right)
            query(middle + 1, r, (pos << 1) + 1);
    }
}

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

    fscanf(in, "%d %d", &N, &M);
    for(position = 1; position <= N; ++position)
    {
        fscanf(in, "%ld", &value);
        value++;
        add(1, N, 1);
    }

    for(; M; --M)
    {
        fscanf(in, "%d %d", &left, &right);
        min = 1 << 30;
        query(1, N, 1);
        fprintf(out, "%ld\n", --min);
    }

    fclose(in);
    fclose(out);
    return 0;
}