Pagini recente » Cod sursa (job #2415500) | Cod sursa (job #1075529) | Cod sursa (job #3169848) | Cod sursa (job #548619) | Cod sursa (job #586887)
Cod sursa(job #586887)
#include <cstdio>
int M[100000][20];
int A[100000];
char log2[100000];
//const int buffSize = 10000;
int RMQ(int i, int j, int *A, int size);
//int log2(int n);
int main()
{
int N, qs;
// char buffer[buffSize];
FILE *f = fopen("rmq.in", "r");
FILE *g = fopen("rmq.out", "w");
fscanf(f, "%d %d\n", &N, &qs);
log2[1] = 0;
for (int i = 2 ; i <= N ; ++i)
log2[i] = log2[i / 2] + 1;
/*
int len = fread(buffer, sizeof(char), buffSize, f);
int index = 0;*/
for (int i = 0 ; i < N ; ++i)
{/*
bool neg = false;
int nr = 0;
if (buffer[index] == '-')
{
neg = true;index++;
}
while (buffer[index] >= '0' && buffer[index] <= '9' && index < len)
{
nr = nr * 10 + buffer[index++] - '0';
if (index == len)
{
len = fread(buffer, sizeof(char), buffSize, f);
index = 0;
}
if (len == 0)
break;
}
index++;
A[i] = nr;*/
fscanf(f, "%d", &A[i]);
M[i][0] = i;
}
for (int j = 1 ; (1 << j) <= N ; ++j)
{
for (int i = 0 ; i <= N - (1 << j) ; ++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];
}
}
for (int i = 0 ; i < qs ; ++i)
{
int left, right;/*
int nr = 0;
if (index == len)
{
len = fread(buffer, sizeof(char), buffSize, f);
index = 0;
}
while (buffer[index] >= '0' && buffer[index] <= '9' && index < len)
{
nr = nr * 10 + buffer[index++] - '0';
if (index == len)
{
len = fread(buffer, sizeof(char), buffSize, f);
index = 0;
}
if (len == 0)
break;
}
index++;
left = nr;
nr = 0;
if (index == len)
{
len = fread(buffer, sizeof(char), buffSize, f);
index = 0;
}
while (buffer[index] >= '0' && buffer[index] <= '9' && index < len)
{
nr = nr * 10 + buffer[index++] - '0';
if (index == len)
{
len = fread(buffer, sizeof(char), buffSize, f);
index = 0;
}
if (len == 0)
break;
}
index++;
right = nr;*/
fscanf(f, "%d %d\n", &left, &right);
fprintf(g, "%d\n", A[RMQ(left - 1, right - 1, A, N)]);
}
return 0;
}
int RMQ(int i, int j, int *A, int size)
{
int k = log2[j - i + 1];
if (A[M[i][k]] <= A[M[j - (1 << k) + 1][k]])
return M[i][k];
return M[j - (1 << k) + 1][k];
}
/*
int log2(int n)
{
int answer = 0;
while ((n & (1 << 20 - answer)) == 0)
answer++;
return (20 - answer);
}
*/