Pagini recente » Cod sursa (job #176659) | Cod sursa (job #1613863) | Cod sursa (job #1246012) | Cod sursa (job #1824934) | Cod sursa (job #2724805)
#include <bits/stdc++.h>
#define MAX 100001
using namespace std;
///Se da un vector cu N elemente.
/// Scrieti un program care raspunde la M intrebari de tipul "Care este elementul minim din intervalul [x,y]?"
///SPARSE TABLE ALGORITHM
///lookup[i][j] = minimum of sequence starting at position i and of length 2^j
///the formula is -> lookup[i][j] = lookup[i][j-1] if arr[lookup[i][j-1]] < arr[lookup[i+2^(j-1)][j-1]] else lookup[i][i+2^(j-1)]
///for an arbitrary interval (x,y) rmq(x,y) = min(lookup[x][cpt] , lookup[y-(1<<cpt)+1][cpt]) , cpt = (log(y-x+1))
ifstream f("rmq.in");
ofstream g("rmq.out");
int n , M , x , y;
int v[MAX];
int lookup[MAX][100];
void fill_lookup(){
for(int i=0;i<n;++i){
lookup[i][0] = i;
}
for(int j=1;(1<<j)<=n;++j){
for(int i=0;(i+(1<<j)-1)<n;++i){
if(v[lookup[i][j-1]] <= v[lookup[i+(1<<(j-1))][j-1]])
lookup[i][j] = lookup[i][j-1];
else
lookup[i][j] = lookup[i+(1<<(j-1))][j-1];
}
}
}
void query(){
int j = (int)log2(y-x+1);
if(v[lookup[x][j]] <= v[lookup[y-(1<<j)+1][j]])
g<<v[lookup[x][j]]<<"\n";
else
g<<v[lookup[y-(1<<j)+1][j]]<<"\n";
}
int main()
{
f>>n>>M;
for(int i=0;i<n;++i){
f>>v[i];
}
fill_lookup();
for(int m=1;m<=M;++m){
f>>x>>y;
--x , --y;
query();
}
return 0;
}