Pagini recente » Cod sursa (job #596323) | Cod sursa (job #17726) | Cod sursa (job #1934898) | Cod sursa (job #2561690) | Cod sursa (job #2065401)
#include<cstdio>
#include<cmath>
#include<cctype>
#define MAX_N 100000
#define MAX_SQRT 317
#define BUF_SIZE 1 << 19
using namespace std;
int v[MAX_N], seg[MAX_SQRT], n, q, segS, poz = BUF_SIZE;
char buf[BUF_SIZE];
inline int minim(int a, int b) {
return (a <= b ? a : b);
}
char getChar(FILE *fin) {
if(poz == BUF_SIZE) {
fread(buf,1,BUF_SIZE,fin);
poz = 0;
}
return buf[poz++];
}
int read(FILE *fin) {
int rez = 0;
char ch;
ch = getChar(fin);
while(!isdigit(ch))
ch = getChar(fin);
while(isdigit(ch)) {
rez = 10*rez + ch - '0';
ch = getChar(fin);
}
return rez;
}
int main() {
int i, j, x, y, m;
FILE *fin, *fout;
fin = fopen("rmq.in","r");
fout = fopen("rmq.out","w");
n = read(fin); q = read(fin);
for(i=0; i<n; i++)
v[i] = read(fin);
segS = sqrt(n);
for(i=0; i<n; i++) {
if(i % segS == 0)
seg[i / segS] = v[i];
else seg[i / segS] = minim(seg[i / segS],v[i]);
}
for(i=0; i<q; i++) {
x = read(fin); y = read(fin);
x--,y--;
m = v[x];
j = x + 1;
while(j <= y) {
if((j % segS == 0) && (j + segS <= y + 1)) {
m = minim(m, seg[j / segS]);
j += segS;
} else {
m = minim(m,v[j]);
j++;
}
}
fprintf(fout,"%d\n",m);
}
fclose(fin);
fclose(fout);
return 0;
}