Pagini recente » Cod sursa (job #1072789) | Cod sursa (job #1120781) | Cod sursa (job #1201767) | Cod sursa (job #1420725) | Cod sursa (job #2866114)
#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(lg[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";
}
}