Cod sursa(job #968300)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 1 iulie 2013 22:14:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>

using namespace std;

int n, m;
int a[100010];
int lg[100010]; /// lg[i] = partea intreaga a log in baza 2 de i
int rmq[17][100010];/// rmq[i][j] = minimul dintr-o secventa care incepe la pozitia j si are lungime 2^i

inline void Compute()
{
    int i, j, lim;
    for (i=2; i<=n; i++)
        lg[i] = lg[i>>1] + 1;
    ///
    for (i=1; i<=n; i++)
        rmq[0][i] = a[i]; /// initializare
    for (i=1; (1<<i) <= n; i++)
    {
        lim = n - (1<<i) + 1;
        for (j=1; j<=lim; j++)
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
        /// impart secventa de lungime 2^i in 2 secvente de lungime 2^(i-1) si aleg minimul dintre cele 2
    }
}

int main()
{
    ifstream f ("rmq.in");
    ofstream g ("rmq.out");
    f>>n>>m;
    int i, x, y, dif, L, lungime;
    for (i=1; i<=n; i++)
        f>>a[i];
    Compute();
    while (m--)
    {
        f>>x>>y;
        dif = y - x + 1;
        L = lg[dif];
        lungime = (1<<L);
        g<<min(rmq[L][x], rmq[L][x+dif-lungime])<<"\n";
    }
    f.close();
    g.close();
    return 0;
}