Cod sursa(job #2724793)

Utilizator handicapatucavasi eduard handicapatu Data 17 martie 2021 21:00:31
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
///Se da un vector cu N elemente.
/// Scrieti un program care raspunde la M intrebari de tipul "Care este elementul minim din intervalul [x,y]?"
///SPARSE TABLE ALGORITHM
///lookup[i][j] = minimum of sequence starting at position i and of length 2^j
///the formula is -> lookup[i][j] = lookup[i][j-1] if arr[lookup[i][j-1]] < arr[lookup[i+2^(j-1)][j-1]] else lookup[i][i+2^(j-1)]
///for an arbitrary interval (x,y) rmq(x,y) = min(lookup[x][cpt] , lookup[y-(1<<cpt)+1][cpt])  ,  cpt = (log(y-x+1))
ifstream f("rmq.in");
ofstream g("rmq.out");

int n , M , x , y;
int v[100001];
short int lookup[100001][100];
void fill_lookup(){
    for(int i=0;i<n;++i){
        lookup[i][0] = i;
    }
    for(int j=1;(1<<j)<n;++j){
        for(int i=0;(i+(1<<j)-1)<n;++i){
            if(v[lookup[i][j-1]] > v[lookup[i+(1<<(j-1))][j-1]])
                lookup[i][j] = lookup[i+(1<<(j-1))][j-1];
            else
                lookup[i][j] = lookup[i][j-1];
        }
    }
}
void query(){
    int j = (int)log2(y-x+1);
    if(v[lookup[x][j]] < v[lookup[y-(1<<j)+1][j]])
        g<<v[lookup[x][j]]<<"\n";
    else
        g<<v[lookup[y-(1<<j)+1][j]]<<"\n";
}
int main()
{
    f>>n>>M;
    for(int i=0;i<n;++i){
        f>>v[i];
    }
    fill_lookup();
    for(int m=1;m<=M;++m){
        f>>x>>y;
        --x , --y;
        query();
    }

    return 0;
}