Pagini recente » Diferente pentru problema/sumtree intre reviziile 33 si 18 | Cod sursa (job #873386) | Cod sursa (job #294483) | Cod sursa (job #764096) | Cod sursa (job #3337501)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int rmq[100002][18];
int lg[100002];
// O(n log n + m )
int main()
{
int n, m;
fin>>n>>m;
for (int i=1; i<=n; i++){
fin>>rmq[i][0]; // elementele vectorului v[i]
}
// rmq[i][0]= minimul din secventa { v[i] } ( are 1 element 2^0 = 1)
for(int j=1; (1<<j)<=n; j++)
for (int i=1; i+(1<<j)-1<=n; i++)
rmq[i][j]=min( rmq[i][j-1], rmq[i + ( 1<<(j-1) ) ][j-1] );
// secventa care incepe v[i].. are 2^j elemente
lg[1]=0;
for(int i=2; i<=n; i++) lg[i]= 1+ lg[i/2];
for (int i=1; i<=m; i++)
{
int x, y; fin>>x>>y;// v[x]......v[y]
int l=y-x+1;
int p=lg[l];
fout<<min(rmq[x][p], rmq[y-(1<<p)+1][p])<<'\n';
}
return 0;
}