Mai intai trebuie sa te autentifici.
Cod sursa(job #1897677)
Utilizator | Data | 1 martie 2017 17:10:30 | |
---|---|---|---|
Problema | Range minimum query | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.27 kb |
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <climits>
#define NMAX 100005
#define MMAX 1000005
#define INF INT_MAX
using namespace std;
int var;
int n, m;
int mat[2 * NMAX][20];
int a[NMAX];
void initMat()
{
for(int j=1;j<log2(n);j++)
{
for(int i=0;i<n;i++)
{
if(i+(1<<(j-1))<n)
mat[i][j]=min(mat[i][j-1],mat[i+(1<<(j-1))][j-1]);
else
mat[i][j]=mat[i][j-1];
}
}
}
void afla(int x, int y)
{
int var=log2(y-x+1);
if(y-(1<<var)+1>=0)
printf("%d\n",min(mat[x][var],mat[y-(1<<var)+1][var]));
else
printf("%d\n",mat[x][var]);
}
void init()
{
for (int i=1; i<2*NMAX; i++)
for (int j=0; j<20; j++)
mat[i][j] = INF;
}
void read()
{
int x, y;
int var = ceil(log2(n));
scanf("%d %d\n", &n, &m);
for (int i=0; i<n; i++)
{
scanf("%d\n", &mat[i][0]);
a[i] = mat[0][i];
}
//init();
initMat();
for (int i=0; i<m; i++)
{
scanf("%d %d\n", &x, &y);
afla(x-1, y-1);
}
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
read();
return 0;
}