Cod sursa(job #765502)

Utilizator igsifvevc avb igsi Data 7 iulie 2012 23:00:00
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <math.h>

FILE *in, *out;
long int seq[100001], m[317];
int divLen, N, M;

int main()
{
    int i, j, l, r;
    long int min;

    in = fopen("rmq.in", "r");
    out = fopen("rmq.out", "w");
    
    /*reading the input*/
    fscanf(in, "%d %d", &N,&M);
    for(i = 0; i < N; i++)
        fscanf(in, "%ld", &seq[i]);
    /*done reading*/

    /*spliting the input in sequences of length sqrt(N)
      and finding the minimum of each subsequence*/
    divLen = (int)sqrt((double)N);
    for(i = 0; i + divLen < N; i += divLen)
    {
        for(j = i + 1, min = seq[i]; j < i + divLen; j++)
            min = (min > seq[j] ? seq[j] : min);
        m[i/divLen] = min;
    }
    /*done finding minimums of subsequence*/

    /*finding the minimum element for each interval [l, r]*/
    for(; M; M--)
    {
        fscanf(in, "%d %d", &l, &r);
        l--;
        r--;
        min = 1;
        min <<= 60;
        while(l <= r)
        {
            if((l % divLen) == 0 && (l + divLen - 1) <= r)
            {
                min = (min > m[l/divLen] ? m[l/divLen] : min);
                l += divLen;
            }
            else
            {
                min = (min > seq[l] ? seq[l] : min);
                l++;
            }
        }
        fprintf(out, "%ld\n", min);
    }
    /*minimum elements found*/

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