Cod sursa(job #2577682)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 9 martie 2020 18:29:15
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
/**

de lungime 2^i
0: 5 2 4 7 6 3 1 2
1: 2 2 4 6 3 1 1
2: 2 2 3 1 1
3: 1
**/

#include <fstream>
#include <cmath>

#define NMAX 100005
#define LOGNMAX (int)(log2(NMAX))+2
#define log(n) (int)(log2(n))
using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");
int dp[LOGNMAX][NMAX];
int n, x, q;

void form_dp(){
    for(int l = 1; (1<<l)<=n; l++){
        for(int i=0; i + (1<<l) - 1 <n; i++)
            dp[l][i] = min(dp[l-1][i], dp[l-1][i+(1<<(l-1))]);
    }
}

void citire(){
    f>>n>>q;
    for(int i=0; i<n; i++){
        f>>dp[0][i];
    }
}

void query(){
    int a, b; /// intervalul a-b
    for(int i=1; i<=q; i++){
        f>>a>>b;
        a--;b--;
        int val = log(b-a+1);
        g<<min(dp[val][a], dp[val][b-(1<<(val))+1])<<'\n';
    }
}
int main()
{
    citire();
    form_dp();
    query();
    return 0;
}