Cod sursa(job #3133847)

Utilizator infomatic2Liviu Firca infomatic2 Data 27 mai 2023 11:08:21
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

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


void preprocesare(vector<vector<int>>& dp  ,int n,int j){
int putere=1<<(j);
if(putere<n&&putere>0){
    for(int i=0;i<n;i++){
        if((i+(1<<(j-1)))<n){
        dp[j][i]=min(dp[j-1][i],dp[j-1][i+(1<<(j-1))]);
        }
        

        // else{
        //     int index=n-1-(1<<(j-1));
        // dp[j][i]=min(dp[j-1][i],dp[j-1][n-1-(1<<(j-1))]);
        // }

        
    }
    preprocesare(dp,n,j+1);
    
}
}
int main(){
    vector<vector<int>> dp;
    dp.push_back(vector<int>());
    int n,m,temp;
    in>>n>>m;
    for(int i=0;i<n;i++){
        in>>temp;
        
        dp[0].push_back(temp);
    }
    dp.insert(dp.begin()+1,17,vector<int>(dp[0].size(),0));
    preprocesare(dp,n,1);
    
    for(auto &i:dp){
        for( auto j:i){
            cout<<j<<' ';

        }
        cout<<'\n';
    }
    int x,y;
    for(int i=0;i<m;i++){
        in>>x>>y;
        int p=31-__builtin_clz(y-x+1);
        out<<min(dp[p][x-1],dp[p][y-(1<<p)])<<'\n';
    }
}