Cod sursa(job #2615469)

Utilizator Razvank206Dumitriu Razvan Razvank206 Data 14 mai 2020 17:18:38
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define N 100005
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int n, m, i, p, j, m1, m2, lungime, v[N], a[N][20], p2[20];
void putere()
{
    p2[0] = 1;
    for(int i = 1; i <= 20; i ++)
        p2[i] = 2 * p2[i - 1];

}

int main()
{
    putere();


    f >> n >> m;

    for(i = 1; i <= n; i ++)
        {
            f >> v[i];
            a[i][0] = i;
        }

    p = 1;
    j = 1;
    while(j <= log2(n))
    {
        for(i = 1;i<= n; i ++)
        {

            if(v[a[i][j - 1]] < v[a[i + p][j - 1]])
                a[i][j] = a[i][j - 1];
            else
                a[i][j] = a[i + p][j - 1];
        }
        p = p * 2;
        ++j;
    }


    for(i = 1; i <= m; i ++)
    {
        f >> m1 >> m2;
        lungime = m2 - m1 + 1;
        int lg = log2(lungime);

        if(v[a[m1][lg]] < v[a[m1 + lungime - p2[lg]][lg]])
            g << v[a[m1][lg]] << "\n";
        else
            g << v[a[m1 + lungime - p2[lg]][lg]] << "\n";
    }
    return 0;
}