Cod sursa(job #2749830)

Utilizator faalaviaFlavia Podariu faalavia Data 8 mai 2021 14:25:46
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

const long NMAX = 100001;
const long LOGMAX = 18;

long n,m, sparse[NMAX][LOGMAX+2], logg[NMAX];
long a, b;

void computeLOG()
{
   logg[1] = 0;
   for(int i = 2; i <=n; ++i)
       logg[i] = logg[i/2] +1;
}


void construct()
{  // elementele de pe coloana 0 sunt chiar elementele citite la tastatura
   // prima sparse[x][0] sunt elementele minime din intervalul [x, x + 2^0)
     for(long i = 0; i < n; ++i)
        fin >> sparse[i][0];
// construiesc sparse[][] dupa coloane. ultima coloana e j-ul maxim pt care 2^j<= n
    for(long j = 1; (1<<j) <= n ; ++j)
        // ma opresc la i + (1<<j)-1 pt ca nu pot sa am un interval mai lung decat numarul coloanelor
        for(long i = 0; i + (1<<j)-1 < n; ++i)
            sparse[i][j] = min(sparse[i][j-1], sparse[i+ (1<<(j-1))][j-1]);

}
long query(int low, int high)
{
    long numere = high - low +1;
    long k = logg[numere];
    // sparse[low][k] = minimul din intervalul [low, low + 2^k)
    // sparse[low + numere - (1<<k)][k] = minimul din intervalul [low + 2^k, high)
    // low--------low + 2^k-----------high
    return min(sparse[low][k], sparse[low + numere - (1<<k)][k]);

}

int main()
{
    fin >> n >> m;
    construct();
    computeLOG();
    for(long i = 0 ; i < n;i++)
        {for(long j = 0; j < logg[n]+1;j++)
        cout << sparse[i][j]<< " ";
        cout << "\n";
        }


    while(m--)
    {
        fin >> a >> b;
        fout << query(a-1, b-1)<< "\n";
    }


    return 0;
}