Pagini recente » Cod sursa (job #2146962) | Cod sursa (job #2669410) | Cod sursa (job #2310749) | Cod sursa (job #984263) | Cod sursa (job #248641)
Cod sursa(job #248641)
#include <stdio.h>
int a[100000], ms[100000][18];
void buildMs(int a[], int n, int ms[100000][18]) {
int i, j;
for (i = 0; i < n; ++i)
ms[i][0] = i;
for (j = 1; (1<<j) < n; ++j)
for (i = 0; i + (1<<j) - 1 < n; ++i) {
if (a[ms[i][j-1]] < a[ms[i+(1<<(j-1))][j-1]])
ms[i][j] = ms[i][j-1];
else
ms[i][j] = ms[i+(1<<(j-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[100000][18], int l, int u) {
int k = mlog2(u-l+1);
if (a[ms[l][k]] < a[ms[u-(1<<k)+1][k]])
return ms[l][k];
return ms[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);
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;
}