Cod sursa(job #1197544)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 12 iunie 2014 16:27:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>
#include <cstdlib>
#define MX 100001
#define minim(a,b) ((a<b) ? a : b)
using namespace std;

FILE *fin, *fout;

int n,m;
int a[3*MX];
int p1,p2;

char *buffer;
long lsize;
int poz;

inline void adauga(int nod, int left, int right)
{
    if(left == right)
    {
        a[nod] = p1;
        return;
    }
    int mid = (left+right)>>1;
    if(p2 <= mid) adauga(nod<<1, left, mid);
    else adauga((nod<<1)+1, mid+1, right);

    a[nod] = minim(a[nod<<1], a[(nod<<1)+1]);
}

inline int query(int nod, int left, int right)
{
    if(p1<=left && right<=p2) return a[nod];
    int mid = (left+right)>>1;

    int s,d;
    s=d=2000000;
    if(p1 <= mid)
    {
        s = query(nod<<1, left, mid);
    }
    if(mid < p2)
    {
        d = query((nod<<1)+1, mid+1, right);
    }

    return minim(s, d);
}

int numar()
{
    int nr=0;
    while(buffer[poz]<'0' || buffer[poz]>'9') poz++;
    while(buffer[poz]>='0' && buffer[poz]<='9')
    {
        nr = nr*10 + buffer[poz] - '0';
        poz++;
    }
    return nr;
}

void citire()
{
    int i;
    fseek(fin, 0, SEEK_END);
    lsize = ftell(fin);
    rewind(fin);

    buffer = (char*) malloc(lsize);
    lsize = fread(buffer, 1, lsize, fin);

    n = numar();
    m = numar();
    for(i=1; i<=n; i++)
    {
        p1 = numar();
        p2 = i;
        adauga(1, 1, n);
    }

}

int main()
{
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");
    int i,x;

    citire();

    for(i=1; i<=m; i++)
    {
        p1 = numar();
        p2 = numar();
        x = query(1, 1, n);
        fprintf(fout, "%d\n", x);
    }

    free(buffer);

    fclose(fin); fclose(fout);
    return 0;
}