Pagini recente » Cod sursa (job #2529102) | Cod sursa (job #718494) | Cod sursa (job #1976810) | Cod sursa (job #196582) | Cod sursa (job #765502)
Cod sursa(job #765502)
#include <stdio.h>
#include <math.h>
FILE *in, *out;
long int seq[100001], m[317];
int divLen, N, M;
int main()
{
int i, j, l, r;
long int min;
in = fopen("rmq.in", "r");
out = fopen("rmq.out", "w");
/*reading the input*/
fscanf(in, "%d %d", &N,&M);
for(i = 0; i < N; i++)
fscanf(in, "%ld", &seq[i]);
/*done reading*/
/*spliting the input in sequences of length sqrt(N)
and finding the minimum of each subsequence*/
divLen = (int)sqrt((double)N);
for(i = 0; i + divLen < N; i += divLen)
{
for(j = i + 1, min = seq[i]; j < i + divLen; j++)
min = (min > seq[j] ? seq[j] : min);
m[i/divLen] = min;
}
/*done finding minimums of subsequence*/
/*finding the minimum element for each interval [l, r]*/
for(; M; M--)
{
fscanf(in, "%d %d", &l, &r);
l--;
r--;
min = 1;
min <<= 60;
while(l <= r)
{
if((l % divLen) == 0 && (l + divLen - 1) <= r)
{
min = (min > m[l/divLen] ? m[l/divLen] : min);
l += divLen;
}
else
{
min = (min > seq[l] ? seq[l] : min);
l++;
}
}
fprintf(out, "%ld\n", min);
}
/*minimum elements found*/
fclose(in);
fclose(out);
return 0;
}