Cod sursa(job #2416431)

Utilizator Leonard123Mirt Leonard Leonard123 Data 27 aprilie 2019 15:52:56
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
using namespace std;
#define maxn 100005
int n,m, a[maxn], ma[maxn][18],lg[maxn],diff,x,y,l,s;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

void lg_create(){
    lg[1]=0;
    for(int i=2; i<=n; i++)
        lg[i]=lg[i/2]+1;
}

void rmq(){
    for(int i=0; i<n; i++)
        ma[i][0]=i;
    for(int j=1; (1<<j)<=n; j++)
        for(int i=0; i+(1<<j)-1<n; i++)
        if(a[ma[i][j-1]]<a[ma[i + (1 << (j - 1))][j-1]])
            ma[i][j]=ma[i][j-1];
        else
            ma[i][j]=ma[i + (1 << (j - 1))][j-1];
}

int main()
{
    cin>>n>>m;
    for(int i=0; i<n; i++)
        cin>>a[i];
    rmq();
    lg_create();
    while(m){
        m--;
        cin>>x>>y;
        x--;y--;
        diff=y-x+1;
        l=lg[diff];
        cout<<min(a[ma[x][l]],a[ma[x+diff-(1<<l)][l]])<<'\n';
    }
    return 0;
}