Cod sursa(job #2856386)

Utilizator DMR6476Erdic Dragos DMR6476 Data 23 februarie 2022 19:46:10
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int sparseTable[20][100005];
int getAnswer(int st,int dr){
    int len = dr - st;
    int maxPw = 0;
    while(1 << maxPw <= len)
        ++maxPw;
    --maxPw;
    int firstMin = sparseTable[maxPw][st];
    int secondMin = sparseTable[maxPw][dr - (1 << maxPw) + 1];
    if(st != dr)
        return min(firstMin,secondMin);
    else
        return sparseTable[0][st];
}
int main()
{
    int n,queries;
    fin>>n>>queries;
    for(int i = 0 ; i < n; i++)
        fin>>sparseTable[0][i];
    int maxPower = 0;

    while( (1 << maxPower) <= n)
        {
            ++maxPower;
        }
    --maxPower;
    //now you know the maxPower
    for(int i = 1; i <= maxPower; i++)
    {
        for(int j = 0;j <= n - (1 << i); j++)
            sparseTable[i][j] = min(sparseTable[i - 1][j], sparseTable[i - 1][j + (1 << (i - 1)) ]);
    }
//    for(int i = 0 ; i <= maxPower; i++)
//    {
//        for(int j = 0 ; j < n ; j++)
//            cout<<sparseTable[i][j]<<" ";
//        cout<<'\n';
//    }
    for(int i = 0; i < queries; i++)
    {
        int st,dr;
        fin>>st>>dr;
        --st,--dr;
        fout<<getAnswer(st,dr)<<'\n';
    }
    return 0;
}