Cod sursa(job #2000807)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 14 iulie 2017 20:08:19
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <cmath>
using namespace std;

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

#define cin fin
#define cout fout
#define MAX 320


int lookup[MAX][MAX];
int a[100005];

struct Query
{
    int L, R;
};
Query q[1000005];

void preprocess(int arr[], int n)
{

    for (int i = 0; i < n; i++)
        lookup[i][0] = i;


    for (int j=1; (1<<j)<=n; j++)
    {
        for (int i=0; (i+(1<<j)-1) < n; i++)
        {
            if (arr[lookup[i][j-1]] < arr[lookup[i + (1<<(j-1))][j-1]])
                lookup[i][j] = lookup[i][j-1];
            else
                lookup[i][j] = lookup[i + (1 << (j-1))][j-1];
        }
    }
}


int query(int arr[], int L, int R)
{
    int j = (int)log2(R-L+1);

    if (arr[lookup[L][j]] <= arr[lookup[R-(int)pow(2,j)+1][j]])
        return arr[lookup[L][j]];

    else return arr[lookup[R-(int)pow(2,j)+1][j]];
}


void RMQ(int arr[], int n, Query q[], int m)
{
    preprocess(arr, n);


    for (int i=0; i<m; i++)
    {
        int L = q[i].L, R = q[i].R;
        cout << query(arr, L, R) << '\n';;
    }
}

int main()
{
    int n, m;
    fin >> n >> m;

    for(int i = 0; i < n; ++i)
        fin >> a[i];

    for(int i = 0; i < m; ++i)
    {
        int nr1, nr2;
        fin >> nr1 >> nr2;

        q[i].L = nr1 - 1;
        q[i].R = nr2 - 1;
    }
    RMQ(a, n, q, m);
    return 0;
}