Pagini recente » clasament-arhiva-educationala | Cod sursa (job #3187478) | Cod sursa (job #3299338)
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;
const int N = 1000005; // capacitatea lui N
const int LOG = 20; // maxima putere a lui 2 , mai mult decat suficient
int M[N][LOG]; // sparse table-ul
int log2val[N]; // log-ul in baza 2 pentru un i specific
void computeLog(int n){
log2val[1] = 0;
for(int i = 2; i<=n ; i++){
log2val[i] = log2val[i/2] + 1;
}
}
void buildSparseTable(vector<int> &a){
int n = a.size();
for(int i =0 ; i<n ; i++){
M[i][0] = a[i]; // minimul fiecarui index pe un interval de lungime 1 este chiar numarul de pe index
}
for(int j = 1; (1<<j) <= n ; j++){ // aici merge pe fiecare coloana ( putere a lui 2)
for(int i =0 ; i+( 1<<j)<= n ; i++ ){ // aici mergem pe fiecare rand(index-urile), de notat ca index + putere sa nu iasa din size
M[i][j] = min(M[i][j-1] , M[i +(1<<(j-1))][j-1]);
//aici facem minimul pe 2 intervale. Primul interval -> de la index la puterea precedenta de 2
//al doilea interval -> de la index + puterea lui 2 precedenta mergem in fata tot acceasi lungime
// asta asigura acoperirea totala
}
}
computeLog(n);
}
int query(int L, int R){
int k = log2val[R - L +1]; // lungimea de 2 maxima pe acel interval
return min(M[L][k] , M[R - (1<<k) + 1][k]);
//minimul de la inceput pana la puterea maxima de 2
// si de la final mergem in spate puterea lui 2 si adaugam 1
}
ifstream in("rmq.in");
ofstream out("rmq.out");
int main(){
int vector_size , query_number , index1,index2;
in>>vector_size>>query_number;
vector<int> A(vector_size);
for(int i = 0 ; i< vector_size ; i++){
in>>A[i];
}
buildSparseTable(A);
for(int i =0 ; i<query_number ; i++){
in>>index1>>index2;
out<<query(index1-1 , index2-1 )<<endl;
}
}