Pagini recente » Cod sursa (job #1752956) | Cod sursa (job #2893182) | Cod sursa (job #1760468) | Autentificare | Cod sursa (job #248631)
Cod sursa(job #248631)
#include <stdio.h>
int a[100000];
int ma[100000][18];
void buildM(int a[], int n, int m[100000][18]) {
int i, j;
for (i = 0; i < n; ++i)
m[i][0] = i;
for (j = 1; (1<<j) < n; ++j)
for (i = 0; i + (1<<j) - 1 < n; ++i)
if (a[m[i][j-1]] < a[m[i + (1<<(j-1))][j-1]])
m[i][j] = m[i][j-1];
else
m[i][j] = m[i + (1<<(j-1))][j-1];
}
inline int mlog2(int n) {
int i;
for (i = 0; 1<<i <= n; ++i)
;
return i-1;
}
inline int rmq(int a[], int n, int m[100000][18], int l, int u) {
int k = mlog2(u - l + 1);
if (a[m[l][k]] < a[m[u-(1<<k)+1][k]])
return m[l][k];
return m[u-(1<<k)+1][k];
}
int main(int argc, char *argv[]) {
int n, m, i, l, u;
FILE *fi = fopen("rmq.in", "r");
fscanf(fi, "%d %d", &n, &m);
for (i = 0; i < n; ++i)
fscanf(fi, "%d", a+i);
buildM(a, n, ma);
FILE *fo = fopen("rmq.out", "w");
while (m--) {
fscanf(fi, "%d %d", &l, &u);
fprintf(fo, "%d\n", a[rmq(a, n, ma, l-1, u-1)]);
}
fclose(fo);
fclose(fi);
return 0;
}