Cod sursa(job #2522545)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 12 ianuarie 2020 17:43:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 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, paw2[20];
void pawtwo()
{
    paw2[0] = 1;
    for(int i = 1; i <= 20; i ++)
        paw2[i] = 2 * paw2[i - 1];
}
void pre_calc_log()
{
    int val = 1;
    for(int i = 1; val * 2 <= 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();
    pawtwo();
    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 - paw2[k]][k];
        if(v[aux1] < v[aux2])g << v[aux1] << "\n";
        else g << v[aux2] << "\n";
    }
    return 0;
}