Pagini recente » Cod sursa (job #795415) | Cod sursa (job #2857915) | Cod sursa (job #1086527) | Cod sursa (job #310657) | Cod sursa (job #2623608)
#include <bits/stdc++.h>
using namespace std;
const int bigvalue = 100001;
int N,M;
int rmqlen;
void build(int v[], int rmq[], int l = 0, int h = N - 1, int pos = 0){
//cout << l << " " << h << " " << pos << "\n";;
if(l == h){
//cout << "aici da - ";
rmq[pos] = v[l];
//cout << v[l] << " " << rmq[pos] << "\n";
}
else{
int mid = (l + h)/2;
build(v, rmq, l, mid, 2*pos + 1);
build(v, rmq, mid + 1, h, 2*pos + 2);
rmq[pos] = min(rmq[2*pos+1], rmq[2*pos+2]);
//cout << rmq[pos] << " \n";
}
}
int RMQ(int rmq[], int ql, int qh, int l = 0, int h = N - 1, int pos = 0){
if(ql <= l && qh >= h)
return rmq[pos]; // total overlap;
if(ql > h || qh < l)
return bigvalue; // no overleap;
int mid = (l + h)/2;
return min(RMQ(rmq, ql, qh, l, mid, 2*pos+1), RMQ(rmq, ql, qh, mid+1, h, 2*pos + 2));
}
int main()
{
ifstream f("rmq.in");
ofstream g("rmq.out");
f >> N >> M;
rmqlen = N - 1;
rmqlen |= rmqlen >> 1;
rmqlen |= rmqlen >> 2;
rmqlen |= rmqlen >> 4;
rmqlen |= rmqlen >> 8;
rmqlen |= rmqlen >> 16;
rmqlen++;
///*
rmqlen = 2*rmqlen - 1;
int v[N],rmq[rmqlen];
for(int i = 0; i < N; i++)
f >> v[i];
for(int i = 0; i < rmqlen; i++)
rmq[i] = bigvalue;
build(v, rmq);
int x, y;
for (int i = 0; i < M; i++){
f >> x >> y;
g << RMQ(rmq, x-1, y-1)<<"\n";
}
//*/
/*
cout << rmqlen << " " << N << " " << M << "\n";
rmqlen = 2*rmqlen - 1;
int v[N],rmq[rmqlen];
for(int i = 0; i < N; i++)
f >> v[i];
for(int i = 0; i < rmqlen; i++)
rmq[i] = bigvalue;
///////////// create rmq //////////
//// left child 2*i+1, right child 2*i+2
//// parent (i-1)/2
cout<<"\n";
build(v, rmq);
cout<<"\n\n";
for(int i = 0; i < rmqlen; i++)
cout << rmq[i] << " ";
int x, y;
for (int i = 0; i < M; i++){
f >> x >> y;
g << RMQ(rmq, x - 1, y - 1)<<"\n";
}
*/
return 0;
}