Cod sursa(job #2445769)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 5 august 2019 14:27:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include<bits/stdc++.h>
#define nmax 100000
#define log2nmax 17

using namespace std;

int lookup[nmax][log2nmax];
//lookup[i][j]=indicele valori minime din intervalul i...i+2^j-1

void preprocess(int arr[],int n)
{
    int i,j;
    //initializare
    for(i=0;i<n;i++)
        lookup[i][0]=i;

    for(j=1;(1<<j)<n;j++)
    for(i=0;i+(1<<j)-1<n;i++)
    if(arr[lookup[i][j-1]]<=arr[lookup[i+(1<<(j-1))][j-1]])
    lookup[i][j]=lookup[i][j-1];
    else
        lookup[i][j]=lookup[i+(1<<(j-1))][j-1];

}

int query(int l,int r,int arr[])
{
    int dim=(int)log2(r-l+1);
    if(arr[lookup[l][dim]]<=arr[lookup[r-(1<<dim)+1][dim]])
        return arr[lookup[l][dim]];
    else
        return arr[lookup[r-(1<<dim)+1][dim]];

}


int main()
{
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    int n,arr[nmax],i,m,a,b;
    fin>>n>>m;
    for(i=0;i<n;i++)
        fin>>arr[i];
    preprocess(arr,n);
    for(i=1;i<=m;i++)
    {
        fin>>a>>b;
        fout<<query(a-1,b-1,arr)<<'\n';
    }
    fin.close();
    fout.close();
}