Cod sursa(job #1470605)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 11 august 2015 18:12:24
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <fstream>
#define N 100005
#define logN 20
using namespace std;
int a[logN][N],n,m;
fstream f,g;
int main()
{
    int i, j, x, y, putere;
    f.open("rmq.in",ios::in);
    g.open("rmq.out",ios::out);
    f>>n>>m;
    for ( i = 1 ; i <= n ; i++)
        f>>a[0][i];
    // facem matricea
    // a[i][j] = min ( a[i] ...., a[i + 2^j -1 ] )// vect intial
    // a[i][j] = min ( a[i-1][j], a[i-1][j+2^(i-1)] )
    for (i = 1 ; (1<<i) <= n ; i++  )
        for (j = 1 ; j + (1<<i) - 1 <=n ; j++ )
            a[i][j] = min ( a[i-1][j], a[i-1][j + (1<<(i-1)) ]);

    // facem interogarile
    // cautam cea mai mare put a lui 2 a.i sa fie inclusa in lungimea intervalului
    // ne ducem pe coloana corespunzatoare matricei
    // sol = min ( a[k][x], a[k][y-2^k + 1]
    for (i = 1 ; i <= m ;i++)
    {
        f>>x>>y;
        putere = 0;
        while ( (1<<(putere +1 ) ) <= y-x)
            putere ++;
        g<<min(a[putere][x], a[putere][y - (1<<putere) + 1])<<"\n";
    }
}