Cod sursa(job #1808695)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 17 noiembrie 2016 23:28:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>

using namespace std;
FILE *fin = fopen("rmq.in", "r");
FILE *fout = fopen("rmq.out", "w");
int answer[18][1000001];
int minim(int a, int b)
{
    if(a <= b) return a;
    return b;
}
int cmmp(int a, int b)
{
    int incadrez = b-a+1;
    int putere = 1;
    while(2*putere<=incadrez)
    {
        putere*=2;
    }
    return putere;
}
int coef(int a, int b)
{
    int incadrez = b-a+1;
    int putere = 1;
    int rand = 1;
    while(2*putere<=incadrez)
    {
        rand++;
        putere*=2;
    }
    return rand;
}
int main()
{
    int n, m;
    fscanf(fin , "%d %d", &n, &m);
    for(int i =1; i <= n; i++)
    {
        fscanf(fin , "%d" , &answer[1][i]);
    }
    int ad=1;
    for(int i = 2; i <= 17 ;i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(j+ad <= n)
            {
                answer[i][j]=minim(answer[i-1][j], answer[i-1][j+ad]);
            }
        }
        ad*=2;
    }
    int x,y;
    for(int i = 1; i <= m; i++)
    {
        fscanf(fin , "%d%d", &x, &y);
        int diametru = cmmp(x , y);
        int coeficient = coef(x, y);
        fprintf(fout, "%d\n", minim(answer[coeficient][x], answer[coeficient][y-diametru+1]));
    }
    return 0;
}