Cod sursa(job #1653991)

Utilizator malina_floreaMalina Florea malina_florea Data 16 martie 2016 19:05:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#define DMAX 100004
using namespace std;
FILE * fin = fopen ("arbint.in", "r");
FILE * fout = fopen ("arbint.out", "w");

void citire();
void update(int, int, int, int, int);
int query(int, int, int, int, int);

int n, m;
int tree[4*DMAX];

int main()
{
    citire();
    
    int i, c, a, b;
    for (i=1; i<=m; i++)
    {
        fscanf(fin, "%d %d %d", &c, &a, &b);
        if (c==0)
            fprintf(fout, "%d\n", query(1, 1, n, a, b));
        else
            update(1, 1, n, a, b);
    }
    
    fclose(fin);
    fclose(fout);
    return 0;
}

void citire()
{
    int i, x;
    fscanf(fin, "%d %d", &n, &m);
    
    for (i=1; i<4*DMAX; i++) tree[i]=-1;
    
    for (i=1; i<=n; i++)
    {
        fscanf(fin, "%d", &x);
        update(1, 1, n, i, x);
    }
}

void update(int nod, int st, int dr, int pos, int x)
{
    if (st==dr)
    {
        tree[nod]=x;
        return;
    }
    
    int mij=(st+dr)/2;
    
    if (pos<=mij)
        update (nod*2, st, mij, pos, x);
    else
        update (nod*2+1, mij+1, dr, pos, x);
    
    //actualizare
    if (tree[nod*2]>tree[nod*2+1])
        tree[nod]=tree[nod*2];
    else
        tree[nod]=tree[nod*2+1];
}

int query (int nod, int st, int dr, int a, int b)
{
    if (a<=st && dr<=b)
        return tree[nod];
    
    int mij=(st+dr)/2, rs=-1, rd=-1;
    
    if (a<=mij)
        rs = query (nod*2, st, mij, a, b);
    
    if (b>mij)
        rd = query (nod*2+1, mij+1, dr, a, b);
    
    if (rs>rd) return rs;
    return rd;
}