Cod sursa(job #2751401)

Utilizator EmiHHodoroaba Emanuel EmiH Data 14 mai 2021 22:17:08
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 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=0;i<n;i++){
        in >> vec[i];
    }
    for (int i=0;i<n;i++){
        for (int j=0;j<18;j++){
            ans[i][j]=0;//initializam cu 0
        }
    }
    for (int i=0;i<n;i++)
        ans[i][0]=i;//prima coloana = cu nr liniei

    for(int j=1;(1<<j)<=n;j++)//pana la cea mai mare putere a lui 2 mai mica ca n
    {
        for (int i=0;(i+(1<<j)-1)<n;i++)
        {
            if (vec[ans[i][j-1]]<vec[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;
        x--;
        y--;
        int j = (int)log2(y - x + 1);
        if (vec[ans[x][j]]<=vec[ans[y-(1<<j)+1][j]]){
            out << vec[ans[x][j]] << " ";
        }else{
            out << vec[ans[y-(1<<j)+1][j]] << " ";
        }
    }

    return 0;
}