Pagini recente » Cod sursa (job #1006602) | Cod sursa (job #1023163) | Cod sursa (job #2546065) | Cod sursa (job #984863) | Cod sursa (job #1700911)
#include <stdio.h>
#define MAX_N 100000
#define MAX_LOGN 16
int rmq[1+MAX_N][1+MAX_LOGN];
int logn[1+MAX_N], p2[1+MAX_LOGN];
void puteri() {
int maxP2, exp, i;
maxP2 = 2;
exp = 0;
for(i = 1; i <= MAX_N; i++) {
if(i == maxP2) {
maxP2 *= 2;
exp++;
}
logn[i] = exp;
}
i = 0;
maxP2 = 1;
while(maxP2 <= MAX_N) {
p2[i] = maxP2;
i++;
maxP2 = maxP2 * 2;
}
}
int min(int a, int b) {
if(b < a)
return b;
return a;
}
int main() {
int n, i, q, j, x, y, bestLog;
puteri();
FILE *fin = fopen( "rmq.in" , "r" );
fscanf(fin, "%d%d", &n, &q);
for(i = 1; i <= n; i++)
fscanf(fin, "%d", &rmq[i][0]);
for(j = 1; j <= logn[n]; j++)
for(i = 1; i <= n - p2[j] + 1; i++)
rmq[i][j] = min(rmq[i][j - 1], rmq[i + p2[j - 1]][j - 1]);
FILE *fout = fopen( "rmq.out" , "w" );
for(i = 1; i <= q; i++) {
fscanf(fin, "%d%d", &x, &y);
bestLog = logn[y - x + 1];
fprintf(fout, "%d\n", min(rmq[x][bestLog], rmq[y - p2[bestLog] + 1][bestLog]));
}
fclose( fin );
fclose( fout );
return 0;
}