Cod sursa(job #2758252)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 9 iunie 2021 11:52:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int N, M, mat[20][300005];

int minQuery(int x, int y)
{
    int lg = y - x + 1;
    int pm = 1, ip = 0;
    while (pm * 2 <= lg) {
        pm *= 2; ip++;
    }         //caut cea mai mare putere a lui 2 mai mica decat lungimea intervalului
    return min(mat[ip][x], mat[ip][y - pm + 1]);    //intervalele se pot intrepatrunde pentru ca fac minimul si nu influenteaza

}
int main()
{
    int x, y;
    fin >> N >> M;
    for (int i = 0; i < 17; ++i)   //initializam cu valori care sa nu afecteze aflarea minimului
        for (int j = 0; j < 300000; ++j)  mat[i][j] = 100005;
    for (int j = 0; j < N; ++j)  fin >> mat[0][j]; //prima linie e vectorul
    for (int i = 1, r = 2; r <= N; ++i, r *= 2) //r=2^i
        //val[i][j]=minimul secventei pornind din pozitia j si avand o lungime de 2^i numere
        for (int j = 0; j < N; ++j)  mat[i][j] = min(mat[i - 1][j], mat[i - 1][j + r / 2]);
    for (int i = 1; i <= M; ++i)
    {
        fin >> x >> y; //capetele intervalului
        fout << minQuery(x - 1, y - 1) << "\n"; //indexare de la 0 in matricea mea
    }
    return 0;
}