Cod sursa(job #2751434)

Utilizator EmiHHodoroaba Emanuel EmiH Data 14 mai 2021 23:34:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <bits/stdc++.h>
#include <fstream>

using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int main()
{
    long n,m,x,y;
    in >> n >> m;
    long int ans[100002][18];
    long int vec[100002];
    for(int i=1;i<=n;i++){
        in >> ans[i][0];
    }
    for (int i = 2; i <= n; ++i)
		vec[i] = 1 + vec[i / 2];

    for(int j=1;(1<<j)<=n;j++)//pana la cea mai mare putere a lui 2 mai mica ca n
    {
        for (int i=1;(i+(1<<j)-1)<=n;i++)
        {
            if (ans[i][j-1]<ans[i+(1<<(j-1))][j-1])
                ans[i][j]=ans[i][j-1];
            else
                ans[i][j]=ans[i+(1<<(j-1))][j-1];
        }
    }

    for(int i=1;i<=m;i++){
        in >> x >> y;
        int temp = vec[y - x + 1];
        if (ans[x][temp]<=ans[y-(1<<temp)+1][temp]){
            out << ans[x][temp] << "\n";
        }else{
            out << ans[y-(1<<temp)+1][temp] << "\n";
        }
    }

    return 0;
}