Pagini recente » Cod sursa (job #960393) | Cod sursa (job #327871) | Cod sursa (job #2302823) | Cod sursa (job #2955500) | Cod sursa (job #2900289)
#include <bits/stdc++.h>
#define FILE "rmq"
using namespace std;
ifstream fin(FILE".in");
ofstream fout(FILE".out");
pair<int, pair<int, int > > rmq[200005];
int N,x,y,M,nodes;
void insert(int val, int pos, int posInRMQ, int st, int dr){
if(st == dr){
rmq[posInRMQ].first = val;
return;
}
if(pos <= (st+dr)/2){
insert(val, pos, posInRMQ*2, st, (st+dr)/2);
rmq[posInRMQ].first = min(rmq[posInRMQ*2].first, rmq[posInRMQ*2 + 1].first);
}
if(pos >= (st+dr)/2){
insert(val, pos, posInRMQ*2 + 1, (st+dr)/2+1, dr);
rmq[posInRMQ].first = min(rmq[posInRMQ*2].first, rmq[posInRMQ*2 + 1].first);
}
}
int getMinValue(int x, int y, int pos){
if(x <= rmq[pos].second.first && y >= rmq[pos].second.second)
return rmq[pos].first;
else if(rmq[pos].second.first <= y && rmq[pos].second.second >= x)
return min(getMinValue(x,y,2*pos),getMinValue(x,y,2*pos+1));
return INT_MAX;
}
void preprocess(int st = 0, int dr = N-1, int pos = 1){
rmq[pos].second.first = st+1;
rmq[pos].second.second = dr+1;
rmq[pos].first = INT_MAX;
if(st == dr)
return;
preprocess(st, (st+dr)/2, pos*2);
preprocess((st+dr)/2+1, dr, pos*2 + 1);
}
int nextpow(int n){
int i = 1;
while(i < n)
i <<= 1;
return i<<1;
}
int main(){
fin >> N >> M;
nodes = 2* N - 1;
preprocess();
for(int i = 0; i < N; ++i){
fin >> x;
insert(x, i, 1, 0, N-1);
}
for(int i = 1; i <= nodes; ++i){
// cout <<i << ": " << rmq[i].first << ": " << rmq[i].second.first << ' ' << rmq[i].second.second << '\n';
}
for(int i = 0; i < M; ++i){
fin >> x >> y;
fout << getMinValue(x,y,1) << '\n';
}
}
/*
1 5 6 4 3
0-4
1
0-2 3-4
1 3
0-1 2-2
1 6
*/