Cod sursa(job #2635229)

Utilizator irimia_alexIrimia Alex irimia_alex Data 13 iulie 2020 18:22:46
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#define NMAX 100000

using namespace std;

FILE* fin, * fout;

int n, m, v[NMAX + 1];
int t[NMAX][17];

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

void builTable() {
    for (int i = 1;i <= n;++i)
        t[i][0] = v[i];
    for (int j = 1;(1 << j) <= n;++j) {
        for (int i = 1;i + (1 << j)-1 <= n;++i)
            t[i][j] = min(t[i][j - 1], t[i + (1 << (j-1))][j - 1]);
    }

    for (int i = 1;i <= n;++i) {
        for (int j = 0;j <= 5;++j)
            printf("%i ", t[i][j]);
        printf("\n");
    }
}

int log2(int x) {
    int res = 0;
    while (x>1) {
        ++res;
        x /= 2;
    }
    return res;
}

int getMin(int x, int y) {
    int r = log2(y - x + 1);
    return min(t[x][r], t[y - (1 << r) + 1][r]);
}

int main()
{
    fin = fopen("file.in", "r");
    fout = fopen("aib.out", "w");

    fscanf(fin, "%i %i", &n, &m);
    for (int i = 1;i <= n;++i) {
        fscanf(fin,"%i", &v[i]);
    }
    builTable();
    while (m--) {
        int x, y;
        fscanf(fin, "%i %i", &x, &y);
        printf("%i\n", getMin(x, y));
    }
  
    return 0;
}