Cod sursa(job #2522526)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 12 ianuarie 2020 17:30:29
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#define N_MAX 100005
using namespace std;
int n, q, i, val, j, A, B, k, length, aux1, aux2, logaritm[N_MAX], v[N_MAX], a[N_MAX][20], cont;
int paw(int a, int b)
{
    int r = 1, rez = a;
    while(b > 1)
    {
        if(b % 2 == 0)
        {
            rez = rez * rez;
            b = b / 2;
        }
        else
        {
            r = r * rez;
            rez = rez * rez;
            b = b / 2;
        }
    }
    return r * rez;
}
void pre_calc_log()
{
    int val = 1;
    for(int i = 1; val <= N_MAX; i ++)
    {
        val = val * 2;
        logaritm[val] ++;
    }
    for(int i = 1; i <= N_MAX; i ++)
        logaritm[i] = logaritm[i] + logaritm[i - 1];             //Smenul lui Mars pentru a precalcula parte intreaga din log(x)
}
int main()
{
    pre_calc_log();
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    f >> n >> q;
    for(i = 1; i <= n; i ++)
        f >> v[i];
    for(i = 1; i <= n; i ++)
        a[i][0] = i;
    val = 1;
    cont = 1;
    for(j = 1; j <= logaritm[n]; j ++)
    {
        for(i = 1;i + cont <= n; i ++)
        {
            aux1 = a[i][j - 1];
            aux2 = a[i + val][j - 1];
            if(v[aux1] < v[aux2])a[i][j] = aux1;
            else a[i][j] = aux2;
        }
        val = val * 2;
        cont = cont + val;
    }
    for(i = 1; i <= q; i ++)
    {
        f >> A >> B;
        length = B - A + 1;
        k = logaritm[length];
        aux1 = a[A][k];
        aux2 = a[A + length - paw(2, k)][k];
        if(v[aux1] < v[aux2])g << v[aux1] << "\n";
        else g << v[aux2] << "\n";
    }
    return 0;
}