Pagini recente » Cod sursa (job #1142178) | Cod sursa (job #2263350) | Cod sursa (job #753638) | Cod sursa (job #766174) | Cod sursa (job #248643)
Cod sursa(job #248643)
#include <stdio.h>
int a[100000], ms[18][100000];
void buildMs(int a[], int n, int ms[18][100000]) {
int i, j;
for (i = 0; i < n; ++i)
ms[0][i] = i;
for (j = 1; (1<<j) < n; ++j)
for (i = 0; i + (1<<j) - 1 < n; ++i) {
if (a[ms[j-1][i]] < a[ms[j-1][i+(1<<(j-1))]])
ms[j][i] = ms[j-1][i];
else
ms[j][i] = ms[j-1][i+(1<<(j-1))];
}
}
int mlog2(int n) {
int i = 0;
for (; 1<<i <= n; ++i)
;
return (i-1);
}
int rmq(int a[], int n, int ms[18][100000], int l, int u) {
int k = mlog2(u-l+1);
if (a[ms[k][l]] < a[ms[k][u-(1<<k)+1]])
return ms[k][l];
return ms[k][u-(1<<k)+1];
}
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);
buildMs(a, n, ms);
FILE *fo = fopen("rmq.out", "w");
while (m--) {
fscanf(fi, "%d %d", &l, &u);
fprintf(fo, "%d\n", a[rmq(a, n, ms, l-1, u-1)]);
}
fclose(fo);
fclose(fi);
return 0;
}