Cod sursa(job #3243822)

Utilizator uncle_sam_007ioan bulik uncle_sam_007 Data 21 septembrie 2024 16:00:37
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int LOG2=320;
const int NMAX=1e5;

int n;
int r[LOG2][NMAX],pow2[NMAX];

//pow2[i]= the maximum value of e, so that 2^e<=i
//r[e][i]= the minimum value in the array in the sequence from i to i+2^e

void BUILD(){
    pow2[1]=0;
    for(int i=2;i<=n;++i){
        pow2[i]=pow2[i/2]+1;
    }
    for(int p=1;(1<<p)<=n;++p){
        for(int i=1;i<=n;++i){
            r[p][i]=r[p-1][i];
            int j=i+(1<<(p-1));
            if(j<=n && r[p][i]>r[p-1][j])
                r[p][i]=r[p-1][j];
        }
    }
}

int RMQ(int st,int dr){
    int LEN=dr-st+1;
    int exp=pow2[LEN];
    return min(r[exp][st],r[exp][dr-(1<<exp)+1]);
}


int main()
{
    int m,st,dr;
    fin>>n>>m;
    for(int i=1;i<=n;++i){
        fin>>r[0][i];
    }
    BUILD();
    for(int i=1;i<=m;++i){
        fin>>st>>dr;
        fout<<RMQ(st,dr)<<"\n";
    }
    return 0;
}