Cod sursa(job #2138298)

Utilizator VascBogdanVasc Bogdan VascBogdan Data 21 februarie 2018 15:37:13
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <cmath>
#define Nmax 100000
#define Logmax 17
using namespace std;

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

int n, Q;
vector<int> v;
int sparsedTable[Nmax][Logmax];

void read()
{

    in >> n >> Q; int x;
    for(int i=1; i<=n; i++)
    {
        in >> x;
        v.push_back(x);
    }

}

int pow2(int x)
{
    return 1<<x;
}

void preprocessing()
{
    for(int i=0; i<n; i++)
        sparsedTable[i][0] = i;

    for(int j=1; j<=floor(log2(n)); j++)
        for(int i=0; i+pow2(j)-1<n; i++)
        {
            int a = sparsedTable[i][j-1];
            int b = sparsedTable[i+pow2(j-1)][j-1];

            sparsedTable[i][j] = v[a]<v[b] ? a:b;
        }
}

int query(int low, int high)
{
    int L = high-low+1;
    int k = floor(log2(L));
    int a = sparsedTable[low][k];
    int b = sparsedTable[high-pow2(k)+1][k];

    return min(v[a], v[b]);

}
/*
void showSparsedTable()
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<=floor(log2(n)); j++)
            cout << sparsedTable[i][j] << " ";
        cout<<endl;
    }
    cout<<endl<<endl;
}*/




int main()
{
    read();
    preprocessing();
    int a,b;
    for(int i=1; i<=Q; i++)
    {
        in>>a>>b;
        out<<query(a-1,b-1)<<'\n';
    }

}