Mai intai trebuie sa te autentifici.
Cod sursa(job #1118076)
Utilizator | Data | 23 februarie 2014 23:23:05 | |
---|---|---|---|
Problema | Range minimum query | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.84 kb |
#include <cstdio>
#include <fstream>
#define MAX 100001
using namespace std;
long maxj,i,j,N,Mnr,sir[MAX],M[MAX][18];
int k,lg[MAX],pw2[20];
int minsir (int x, int y)
{
if (sir[x]<sir[y]) return x;
else return y;
}
int main ()
{
FILE *g;
ifstream f("rmq.in");
g=fopen("rmq.out", "w");
f>>N>>Mnr;
for (i=1; i<=N; i++) {f>>sir[i]; M[i][0]=i;}
lg[1]=0;
for (i=2; i<=N; i++) lg[i]=lg[i/2]+1;
pw2[0]=1;
for (i=1; i<=19; i++) pw2[i]=pw2[i-1]*2;
maxj=lg[N];
for (j=1; j<=maxj; j++)
for (i=1; i+pw2[j]-1<=N; i++)
M[i][j]=minsir(M[i][j-1], M[i+pw2[j-1]][j-1]);
for (; Mnr>=1; Mnr--)
{
f>>i>>j;
fprintf(g, "%d\n", sir[minsir(M[i][lg[j-i+1]],M[j-pw2[lg[j-i+1]]+1][lg[j-i+1]])]);
}
f.close(); fclose(g);
return 0;
}