Pagini recente » Cod sursa (job #1394389) | Cod sursa (job #575447) | Cod sursa (job #314485) | Cod sursa (job #3285511) | Cod sursa (job #1398208)
#include <fstream>
using namespace std;
#define IN "rmq.in"
#define OUT "rmq.out"
#define DMAX 100008
#define LOGMAX 20
ifstream fin(IN);
ofstream fout(OUT);
int n, ma;
int v[DMAX];
int m[DMAX][LOGMAX];
int putere[LOGMAX];
void citire();
void dinamica();
int rmq(int, int);
int log(int);
inline int minim(int a, int b){
if (a<b)
return a;
return b;
}
int main(){
citire();
return 0;
}
int log(int x){
int i;
for (i=LOGMAX-1; i>=0; --i)
if (putere[i]<=x)
return i;
return 0;
}
void dinamica(){
int i, j;
for (i=1; i<=n; ++i)
m[i][0]=v[i];
//m -> pozitia
for (j=1; putere[j]<=n; ++j)
for (i=1; i+putere[j]-1<=n; ++i)
m[i][j]=minim(m[i][j-1], m[i+putere[j-1]][j-1]);
}
int rmq(int i, int j){
int len=j-i+1;
int k=log(len);
int x=len-putere[k];
return minim(m[i][k], m[i+x][k]);
}
void citire(){
fin >>n>>ma;
int i;
for (i=1; i<=n; ++i)
fin >>v[i];
for (i=0; i<LOGMAX; ++i)
putere[i]=1<<i;
//dinamica
dinamica();
//intrebare
int x, y;
for (i=1; i<=ma; ++i){
fin >>x>>y;
fout <<rmq(x, y)<<'\n';
}
fout.close();
}