Cod sursa(job #3237371)

Utilizator petruciungu@gmail.comPiatra Slefuita [email protected] Data 8 iulie 2024 17:29:28
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>
using namespace std;
#define cin fin
ifstream fin("rmq.in");
#define cout fout
ofstream fout("rmq.out");
long long int r[1000][100000], i, j, p, len, e, m, st, dr, E[10000];
int mi(int st, int dr){
    e=E[dr-st+1];
    p=(1<<e);
    int x=min(r[e][st], r[e][dr-p+1]);
    if(x==r[e][st]) return r[e][st];
    return r[e][dr-p+1];
}
int main(){
    int n;
    cin>>n;
    cin>>m;
    for(int i=1; i<=n; i++){
        cin>>r[0][i];
    }
    for(p=1; (1<<p)<=n; p++){
        for(int i=1; i<=n; i++){
            r[p][i]=r[p-1][i];
            j=i+(1<<(p-1));
            if(j<=n && r[p-1][j]<r[p][i]){
                r[p][i]=r[p-1][j];
            }
        }
    }
    E[1]=0;
    for(int i=2; i<=n; i++){
        E[i]=1+E[i/2];
    }
    for(int i=0; i<m; i++){
        cin>>st>>dr;
        cout<<mi(st, dr)<<"\n";
    }
    return 0;
}