Cod sursa(job #1026690)

Utilizator tudy23Coder Coder tudy23 Data 11 noiembrie 2013 21:35:37
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;

const int MAX = 262144;
int aint[MAX];

int query(int a, int b, int nod, int inc, int sf)
{
    if(a<=inc&&b>=sf)
        return aint[nod];
    else
    {
        int m = (inc+sf)>>1;

        if(a<=m&&m<b)
        return max(query(a,b,2*nod,inc,m),query(a,b,2*nod+1,m+1,sf));
        if(a<=m)
            return query(a,b,2*nod,inc,m);
        if(m<b)
            return query(a,b,2*nod+1,m+1,sf);
    }
}

void update(int nod, int inc, int sf, int val, int pos)
{
    if(inc==sf){
        aint[nod] = val;
        return;
    }
    int m = (inc+sf)>>1;

    if(pos<=m) update(2*nod, inc, m, val, pos);
    else update(2*nod+1, m+1, sf, val, pos);

    aint[nod] = max(aint[2*nod],aint[2*nod+1]);
}

int main()
{
    int n,m;
    ifstream f("arbint.in");
    ofstream h("arbint.out");
    f>>n>>m;
    int a;
    int b,c;
    for(int i=1;i<=n;++i)
    {
        f>>a;
        update(1,1,n,a,i);
    }
    while(m--)
    {
        f>>a>>b>>c;
        switch(a)
        {
            case 0:
            h<<query(b,c,1,1,n)<<'\n';
            break;
            case 1:
            update(1,1,n,c,b);
            break;
        }
    }
    f.close();
    h.close();
    return 0;
}