Cod sursa(job #2575509)

Utilizator alisavaAlin Sava alisava Data 6 martie 2020 13:58:44
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
#define lung(x) (1 << (x))

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int a[100005];
int lg2[100005];
int RMQ[20][100005];
int K, n, m;
void GenLog()
{
    for(int i = 1; (1 << i) <= n; i++)
        lg2[(1<<i)] = 1;
    for(int i = 1; i <= n; i++)
    {
        lg2[i] = lg2[i - 1] + lg2[i];
    }
    K = lg2[n];
}

void GenRmq()
{
    for(int i = 1; i <= n; i++)
        RMQ[0][i] = a[i];
    for(int k = 1; k <= K; k++)
    {
        for(int i = 1; i <= n; i++)
            RMQ[k][i] = min(RMQ[k - 1][i], RMQ[k - 1][i + lung(k - 1)]);
    }
    for(int i = 0; i <= K; i++)
    {
        for(int j = 1; j <= n; j++)
            cout << RMQ[i][j] << " ";
        cout << "\n";
    }


}

int Query(int left, int right)
{
    int k = lg2[right - left];
    return min(RMQ[k][left], RMQ[k][right - lung(k) + 1]);
}



int main()
{
    int x, y;
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> a[i];
    GenLog();
    GenRmq();
    for(int i = 1; i <= m; i++)
    {
        fin >> x >> y;
        fout << Query(x, y) << "\n";

    }


    return 0;
}