Cod sursa(job #1329784)

Utilizator maribMarilena Bescuca marib Data 29 ianuarie 2015 20:47:49
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define DIM 100001
#define inf 0x3f3f3f
using namespace std;

int p, v, arbint[DIM], n, m, tip, result;

int inclus(int a, int b, int c)
{
    if(a<=c&&b>=c)
        return 1;
    else return 0;
}

int maxim(int a, int b)
{
    if(a>b)
        return a;
    else return b;
}

void update(int l, int r, int nod)
{
    if(l==r&&l==p)
    {
        arbint[nod]=v;
    }
    else
    {
        if(inclus(l, (l+r)/2, p))
        {
            update(l, (l+r)/2, 2*nod);
        }
        else
        {
            update((l+r)/2+1, r, 2*nod+1);
        }
        arbint[nod]=maxim(arbint[2*nod], arbint[2*nod+1]);
    }

}

int find(int l, int r, int nod)
{
    int mij=(l+r)/2;
    if(p<=l&&v>=r)
    {
        result = maxim (result, arbint[nod]);
    }
    else
    {
        if(p<=mij)
        {
            find(l, mij, 2*nod);
        }
        if(mij<v)
        {
            find(mij+1, r, 2*nod+1);
        }
    }
    return result;
}

int main()
{
    ifstream in ("arbint.in");
    ofstream out("arbint.out");
    in>>n>>m;
    p=1;
    for(int i=1; i<=n; ++i, ++p)
    {
        in>>v;
        update(1, n, 1);
    }
    for(int i=1; i<=m; ++i)
    {
        in>>tip>>p>>v;
        if(!tip)
        {
            result=0;
            out<<find(1, n, 1)<<"\n";
        }
        else update(1, n, 1);
    }
    in.close();
    out.close();
    return 0;
}