Cod sursa(job #1197265)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 11 iunie 2014 15:50:26
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>
#include <vector>
#include <utility>
#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;
vector<int> v;
vector< pair<int, int> > q;

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,x,y;
    pair<int, int> c;
    fscanf(fin, "%d%d", &n, &m);
    v.push_back(0);

    for(i=1; i<=n; i++)
    {
        fscanf(fin, "%d", &x);
        v.push_back(x);
    }

    c.first = 0;
    c.second = 0;
    q.push_back(c);
    for(i=1; i<=m; i++)
    {
        fscanf(fin, "%d%d", &x, &y);
        c.first = x;
        c.second = y;
        q.push_back(c);
    }

    for(i=1; i<=n; i++)
    {
        p1 = v[i];  //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();
    //afisare();

    for(i=1; i<=m; i++)
    {
        p1 = q[i].first;
        p2 = q[i].second;
        x = query(1, 1, n);
        fprintf(fout, "%d\n", x);
    }

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