Cod sursa(job #3250358)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 20 octombrie 2024 13:44:44
Problema Range minimum query Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 100000

int v[MAXN + 1];
int m[17][100000]; ///log2(100000) = 16
int put[17];

int minim (int a, int b)
{
    if (a < b)
    {
        return a;
    }
    return b;
}

void calculare(int N)
{
    int i, j;
    for (i = 1; i <= N; i++)
    {
        m[0][i] = v[i];
    }
    put[0] = 1;
    for (i = 1; i <= 16; i++)
    {
        put[i] = put[i - 1] * 2;
    }
    for (i = 1; (1 << i) <= N; i++)
    {
        for (j = 1; j <= N - (1 << i) + 1; j++)
        {
            m[i][j] = minim(m[i - 1][j], m[i - 1][j + (1 << (i - 1))]);
        }
    }
}

int cb(int nr)
{
    int st = 0, dr = 16, m, sol = -1;
    while (st <= dr)
    {
        m = (st + dr) / 2;
        if (put[m] <= nr)
        {
            sol = m;
            st = m + 1;
        }
        else
        {
            dr = m - 1;
        }
    }
    return sol;
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");
    int N, M, i, a, b;
    fscanf(fin, "%d%d", &N, &M);
    for (i = 1; i <= N; i++)
    {
        fscanf(fin, "%d", &v[i]);
    }
    calculare(N);
    for (i = 1; i <= M; i++)
    {
        fscanf(fin, "%d%d", &a, &b);
        int rez = cb(b - a + 1);
        fprintf(fout, "%d\n", minim(m[rez][a], m[rez][b - rez]));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}