Cod sursa(job #923526)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 23 martie 2013 17:41:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

using namespace std;

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

int a[100010],n,m,x,y;
int rmq[100010][20];
int log[100010];

int main()
{
    fin>>n>>m;
    int l = 0;
    for(int i=1;i<=n;i++)
    {
        fin>>a[i];
        rmq[i][0]=a[i];
        if(i>1)
            log[i] = 1 + log[i>>1];
    }
    //preprocesare
    for(int j = 1; (1<<j) <= n; j++)
        for(int i=1;i + (1<<j)-1<=n;i++)
            rmq[i][j] = min( rmq[i][j-1], rmq[i + (1<<(j-1))][j-1]);
    /**
    desen :)

    |________________|_________________|

    i               i+2^(j-1)         i+2^j

     \ _ _ _ _ _ _ _/ \ _ _ _ _ _ _ _ /
        bloc de            bloc de
        lungime            lungime
        2^(j-1)             2^(j-1)

    */

    //queryuri

    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        l = log[y - x + 1];
        fout<<min( rmq[x][l], rmq[y - (1<<l)+1][l])<<'\n';
    }
    /**
    alt desen :D

    |___________|_______________________|______________|

    x         y-2^L+1                  x+2^L           y
    - - - - - - - - - - - - - - - - - --
                 - - - - - - - - - - - - - - - - - - - -
    pentru queryuri se iau doua intervale care suprapuse
    sa dea intervalul cautat


    */


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