Cod sursa(job #1982172)

Utilizator hanganflorinHangan Florin hanganflorin Data 17 mai 2017 20:00:56
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
using namespace std;

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

int n, m;
vector<int> A;
vector<int> K;
int M[100001][100];

void RMQ();
int Query(int a, int b);
void Preprocesare();

int main()
{
    is >> n >> m;
    A.push_back(0);
    for ( int i = 0, x; i < n; ++i )
    {
        is >> x;
        A.push_back(x);
    }

    Preprocesare();

    RMQ();

    for ( int i = 0, a, b; i < m; ++i )
    {
        is >> a >> b;
        os << Query(a, b) << '\n';
    }

    is.close();
    os.close();
    return 0;
}
void RMQ()
{
   //M.resize(n+1);

    //return;
   // for ( int i = 1; i <= n; ++i )
   //     M[i].resize(n);


    for ( int i = 1; i <= n; ++i )
        M[i][0] = i;
    for ( int j = 1; 1 << j <= n; ++j )
        for ( int i = 0; i + (1<<j) - 1  <= n; ++i )
        {
            int p1 = M[i][j-1];
            int p2 = M[i+ (1<< j-1 ) ][j-1];
            if ( A[p1] < A[p2] )
                M[i][j] = p1;
            else
                M[i][j] = p2;
        }
}
int Query(int i, int j)
{
    int k = K[j-i+1];
    int p1 = M[i][k];
    int p2 = M[j - (1<<k) + 1 ][k];
    if ( A[p1] < A[p2] )
        return A[p1];
    return A[p2];
}
void Preprocesare()
{
    K.resize(n+1);
    for ( int i = 2; i <= n; ++i )
        K[i] = 1 + K[i/2];
}