Pagini recente » Cod sursa (job #1820253) | Cod sursa (job #2337400) | Cod sursa (job #2791957) | Cod sursa (job #2302195) | Cod sursa (job #3134403)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
//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]?"
//Pe prima linie a fisierului rmq.in sunt date numerele N si M. Urmatoarele N linii vor contine cate un numar reprezentand elementele vectorului. Urmatoarele M linii vor contine cate 2 numere reprezentand valorile x si y care definesc intrebarile.
//timp de procesare: O(n*n)
//query time: O(1)
//extra space: O(n*n)
int n,m, rmq[20][100001],x,y, v[100001];
int main(){
f>>n>>m;
for(int i = 1; i <= n; ++i){
f>>v[i];
rmq[0][i]=v[i];
}
//iteram peste puterile lui 2 de la 1 la n (inclusiv)
// pentru a calcula numărul de linii din matricea rmq
//pentru fiecare putere a lui 2, iteram peste toate intervalele de lungime 2^i
for(int i = 1; (1 << i) <= n; ++i)
for(int j = 1; j <= n- (1<<i) + 1; ++j)
//val minimă se calculează prin compararea elementelor din rândul anterior, rmq[i - 1][j] și rmq[i - 1][j + (1 << (i - 1))]. Ultimul indice reprezintă începutul următorului segment de lungime 2^i, deci este egal cu j + 2^(i - 1).
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j+(1<<(i-1))]);
for(int i = 1; i <= m; ++i){
f>>x>>y;
//y-x+1 - lungimea intervalului
//p determina indexul liniei din matricea rmq care trb accesat
int p = log2(y-x+1);
g<<min(rmq[p][x], rmq[p][y - (1 << p) + 1])<<endl;
}
f.close();
g.close();
return 0;
}