Pagini recente » Cod sursa (job #2641150) | Cod sursa (job #2668229) | Cod sursa (job #3169003) | Cod sursa (job #2478494) | Cod sursa (job #2724793)
#include <iostream>
#include <fstream>
#include <math.h>
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[100001];
short int lookup[100001][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+(1<<(j-1))][j-1];
else
lookup[i][j] = lookup[i][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;
}