Pagini recente » Cod sursa (job #256819) | Cod sursa (job #2681240) | Cod sursa (job #485614) | Cod sursa (job #1656648) | Cod sursa (job #990570)
Cod sursa(job #990570)
//O(NlogN+M) Sparse Table (ideea de pe topcoder)
#include <fstream>
#include <vector>
using std::vector;
inline unsigned min(unsigned a, unsigned b){ return a<b?a:b; }
class RMQ{
private:
vector< vector<unsigned> > ST;
public:
RMQ(unsigned n, std::istream &in){
unsigned logn=0,temp=n;
while(temp>>=1) ++logn;
ST.resize(logn+1,vector<unsigned>(n));
for(unsigned i=0;i<n;++i) in>>ST[0][i];
for(unsigned j=1;j<=logn;++j)
for(unsigned i=0;i+(1<<j)-1<n;++i)
ST[j][i]=min(ST[j-1][i],ST[j-1][i+(1<<(j-1))]);
}
unsigned getrmval(unsigned x, unsigned y){
unsigned size=y-x+1,k=0;
while(size>>=1) ++k;
return min(ST[k][x],ST[k][y-(1<<k)+1]);
}
};
int main(){
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
unsigned n,m;
fin>>n>>m;
RMQ sir(n,fin);
while(m--){
unsigned x,y;
fin>>x>>y;
fout<<sir.getrmval(x-1,y-1)<<'\n';
}
}