Cod sursa(job #2866110)

Utilizator CalinachoGherlan Calin Paul Calinacho Data 9 martie 2022 13:00:32
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include<bits/stdc++.h>
using namespace std;

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

int n, m, maxx;
vector<int>v;
vector<vector<int>>rmq;
vector<int>lg;

//precalcularea logurilor
void buildLog(){
    lg.resize(n+1);
    lg[0]=0;
    lg[1]=0;
    for(int i=2;i<=n;i*=2){
        lg[i]=lg[i/2]+1;
    //    out<<"test \n";
    }
    maxx=-1;
    for(int i=1;i<=n;i++){
        if(lg[i]>maxx){
            maxx=lg[i];
    //        out<<"Change: "<<maxx<<" "<<lg[i]<<" ";
        }
        else{ 
            lg[i]=maxx;
    //        out<<lg[i]<<" ";
        }
    }
    
  //  return;
}

int main(){
    //initializari si chestiute
    in>>n>>m;
    buildLog();
    // for(int i=1;i<=n;i++){
    //     out<<lg[i]<<" ";   
    // }
    rmq.resize(n+5, vector<int>(n+5));
    v.resize(n+5);
    
    // bagat valorile din vector in rmq
    for(int i=0;i<n;i++){
    in>>v[i];
    rmq[0][i]=v[i];
    }
    
    //imi declar variabilele de for global din pacate
    int i1=0, j1=1;
    
    //construirea rmqului
    for(j1=1; i1<n && j1<=lg[n]+1; j1++){
        for(i1=0; i1 + (1<<j1)<=n; i1++){
            rmq[j1][i1]=min(rmq[j1-1][i1], rmq[j1-1][i1 + (1<<(j1-1))]);
        }
    }
    
    //output la queryuri
    int st, dr;
    for(int i=0;i<m;i++){
        in>>st>>dr;
        st--;
        dr--;
        out<<min( rmq[lg[dr-st]][st] , rmq[lg[dr-st]][dr-(1 << lg[dr-st])+1])<<"\n";
    }
    
}