Cod sursa(job #3271935)

Utilizator iEmanuelRob Emanuel iEmanuel Data 27 ianuarie 2025 20:50:06
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define cin fin
#define cout fout
int n;
vector<int>mins[20];
vector<int>maxes[20];
int logaritm(int n){
    int p=1;
    int cnt=0;
    while(p<n){
        cnt++;
        p*=2;
    }
    if(p==n)return cnt;
    else return cnt-1;
}

void rmq(int limit){
    //subcsecvente de 2 la i
    //pana la n-2^i

    for(int i=1;i<=limit;i++){
        for(int j=0;j<=n-(1<<i);j++){
            mins[i].push_back(min(mins[i-1][j],mins[i-1][j+(1<<(i-1))]));
            //maxes[i].push_back(max(maxes[i-1][j],maxes[i-1][j+(1<<(i-1))]));
           }
    }
}
int main(){
    int miau;
    cin>>n>>miau;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        mins[0].push_back(x);

    }
    rmq(logaritm(n));
    //implementez faza cu numere distincte
    while(miau--){
        int st,dr;
        cin>>st>>dr;
        int dist=dr-st+1;
        int netrebe=logaritm(dist);
        cout<<min(mins[netrebe][st],mins[netrebe][dr-(1<<netrebe)])<<'\n';

    }

}