Cod sursa(job #2724805)

Utilizator handicapatucavasi eduard handicapatu Data 17 martie 2021 21:34:40
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#define MAX 100001
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[MAX];
int lookup[MAX][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][j-1];

            else
                lookup[i][j] = lookup[i+(1<<(j-1))][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;
}