Cod sursa(job #2065401)

Utilizator Horia14Horia Banciu Horia14 Data 13 noiembrie 2017 19:07:36
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#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;
}