Cod sursa(job #1197263)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 11 iunie 2014 15:32:18
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#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;

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]);
}

int query(int nod, int left, int right)
{
    //daca nu se intersecteaza
    if(left>p2 || right<p1)
    {
        return 2000000;
    }

    //daca e inclus total
    if(p1<=left && right<=p2)
    {
        return a[nod];
    }

    //calculam minimele in cele 2 parti
    int m1,m2;
    int mid = (left+right)>>1;
    m1 = query(nod<<1, left, mid);
    m2 = query((nod<<1)+1, mid+1, right);

    return minim(m1, m2);
}

void citire()
{
    int i;
    fscanf(fin, "%d%d", &n, &m);
    for(i=1; i<=n; i++)
    {
        fscanf(fin, "%d", &p1);  //nr care trebuie adaugat
        p2 = i; //pozitia pe care trebuie adaugat
        adauga(1, 1, n);
    }
}

void afisare()
{
    int i;
    for(i=1; i<=(n<<1); i++)
    {
        fprintf(fout, "%d ", a[i]);
    }
}

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

    citire();

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

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