Cod sursa(job #2550259)

Utilizator Botzki17Botocan Cristian-Alexandru Botzki17 Data 18 februarie 2020 17:29:11
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <cmath>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 100000;
int rmq[25][NMAX+5];
int exponent[NMAX+5];

int main()
{
    int n, m, a, b, i, j, p;
    fin>>n>>m;
    int putere = 1;
    exponent[0] = -1;
    ///Initial o sa precalculam puterile lui 2. Astfel, exponent[i] = x, unde 2^x = i;
    for(i=1;i<=n;i++)
        {
            fin>>rmq[0][i];
            exponent[i] = exponent[i>>1] +1;
        }
    p = exponent[n];
    ///Nr de linii al matricei noastre va fi reprezentat de p unde 2^p<=n;
    for(i=1;i<=p;i++)
    {
        for(j=1;j<= n - (1<<i)+1 ;j++)
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + (1<<(i-1)) ] );
        ///Construirea rmq se va face prin urmatoarea formula rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j +  2^(i-1)]);
    }
    ///Calculam query-urile dupa urmatoarea formula min(rmq[j][a], rmq[j][b- 2^(j) + 1]), unde 2^j <= b - a
    for(i=1;i<=m;i++)
    {
        fin>>a>>b;
        int l = b - a;
        j = exponent[l]; ///aflam acel j-cea mai mare putere a lui 2 mai mica sau egala cu lungimea secventei
        p = (1<<j); /// este echivalent cu (p = 2^j)
        fout<<min(rmq[j][a], rmq[j][b-p+1])<<"\n";
    }


    return 0;
}