Pagini recente » Cod sursa (job #699301) | Cod sursa (job #571967) | Cod sursa (job #190103)
Cod sursa(job #190103)
// solutie proasta optimizata cu arbori de intervale
#include <fstream>
using namespace std;
#define p1 ((poz) * 2)
#define p2 ((poz) * 2 + 1)
#define mij (((st) + (dr)) / 2)
const int INF = 0x3f3f3f3f;
const int MAXN = 100005;
const int DMAX = 4;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M;
int A[MAXN];
int AInt[1 << 17];
void ReadData() {
fin >> N >> M;
for (int i = 1; i <= N; ++i)
fin >> A[i];
}
inline int min(int a, int b) { return (a < b ? a : b); }
inline int max(int a, int b) { return (a > b ? a : b); }
void BuildAInt(int poz, int st, int dr) {
if (dr - st <= DMAX) return;
BuildAInt(p1, st, mij);
BuildAInt(p2, mij+1, dr);
AInt[poz] = min(AInt[p1], AInt[p2]);
}
int Query(int poz, int st, int dr, int a, int b) {
if (dr - st <= DMAX) {
int ret = INF;
int start = max(a, st);
int stop = min(b, dr);
for (int i = start; i <= stop; ++i)
ret = min(ret, A[i]);
return ret;
}
int ret = INF;
if (a <= mij) ret = min(ret, Query(p1, st, mij, a, b));
if (b > mij) ret = min(ret, Query(p2, mij+1, dr, a, b));
return ret;
}
int main() {
ReadData();
BuildAInt(1, 1, N);
for (int op = 0; op < M; ++op) {
int a, b;
fin >> a >> b;
fout << Query(1, 1, N, a, b) << endl;
}
}