Cod sursa(job #926258)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 25 martie 2013 08:57:00
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
using namespace std;


const string file = "rmq";

const string infile = file + ".in";
const string outfile = file + ".out";

#define MAXN 100004
#define MAXL 17

int N;
int M;

int A[MAXN];
int lg[MAXN];

int R[MAXL][MAXN];

void citire()
{
	ifstream fin(infile.c_str());

    fin >> N >> M;

    for(int i = 1; i <= N; i++)
    {
        fin >> A[i];
    }

    for(int i = 2; i <= N; i++)
    {
        lg[i] = lg[i / 2] + 1;
    }

    for(int i = 1; i <= N; i++)
    {
        R[0][i] = A[i];
    }

    for(int i = 1; i <= lg[N]; i++)
    {
        for(int j = 1; j <= N - (1 << (i - 1)); j++)
        {
            R[i][j] = min(R[i - 1][j], R[i - 1][j + (1 << (i - 1))]);
        }
    }

	ofstream fout(outfile.c_str());



    for(int i = 0; i < M; i++)
    {
        int x;
        int y;

        fin >> x >> y;

        int len = y - x + 1;
        int p2 = lg[len];

        int toAdd = len - (1 << p2);

        fout << min(R[p2][x], R[p2][x + toAdd]) << "\n";

    }

    fout.close();
	fin.close();
}


int main()
{
	citire();
}