Pagini recente » Cod sursa (job #253772) | Cod sursa (job #902031) | Cod sursa (job #3129512) | Cod sursa (job #647416) | Cod sursa (job #3124214)
#include <iostream>
#include <cmath>
int n, b, bk, m, v[100005], x, y, sumr[100005] = {100001};
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
sumr[i] = 100001;
}
b = sqrtl(n);
bk = (n & 1) ? (n + 1) / b : n / b;
for(int i = 1; i <= n; ++i) {
const int ind = (i - 1) / b;
if(sumr[ind] > v[i]) sumr[ind] = v[i];
}
for(int i = 1; i <= m; ++i) {
scanf("%d %d", &x, &y);
int mn = 100001;
const int off1 = (x - 1) % b;
const int off2 = (y - 1) % b;
if(off1 == 0 && off2 == b - 1) {
const int ind1 = (x - 1) / b;
const int ind2 = (y - 1) / b;
for(int k = ind1; k <= ind2; ++k) if(mn > sumr[k]) mn = sumr[k];
} else {
const int ind1 = (x - 1) / b;
const int ind2 = (y - 1) / b;
if(off1 == 0) {
for(int k = ind1; k <= ind2; ++k) if(mn > sumr[k]) mn = sumr[k];
for(int k = 0; k < off2; ++k) {
const int kk = (ind2 * b) + k + 1;
if(mn > v[kk]) mn = v[kk];
}
} else if(off2 == b - 1) {
for(int k = ind1 + 1; k <= ind2; ++k) if(mn > sumr[k]) mn = sumr[k];
for(int k = off1; k < b; ++k) {
const int kk = (ind1 * b) + k + 1;
if(mn > v[kk]) mn = v[kk];
}
}
}
printf("%d\n", mn);
}
fclose(stdin);
fclose(stdout);
return 0;
}