Cod sursa(job #2328552)

Utilizator ImbuzanRaduImbuzan Radu ImbuzanRadu Data 25 ianuarie 2019 21:52:36
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

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

///n - nr de elem. al vectorului
///m - nr de intrebari de forma [a, b]
int n, m;
int a[100001];
int st[100][100];

void generateSparseTable()
{
    for(int i = 0; i < n; i++)
        st[i][0] = a[i];

    for(int j = 1; (1<<j) <= n; j++)
        for(int i = 0; (i + (1 << j) - 1) < n; i++)
        {
            st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
        }
}

void printSparseTable()
{
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
            cout<<st[i][j];
        cout<<endl;
    }
}

int main()
{
    f>>n>>m;
    for(int i = 0; i < n; i++)
    {
        f>>a[i];
    }

    generateSparseTable();


    int L, R;
    for(int i = 0; i < m; i++)
    {
        f>>L>>R;

        L--;
        R--;

        int j = log2(R - L + 1); ///log2(lungimea intervalului)

        g<<min(st[L][j], st[R - (1 << j) + 1][j])<<'\n';
    }

    return 0;
}