Cod sursa(job #1026705)

Utilizator tudy23Coder Coder tudy23 Data 11 noiembrie 2013 21:41:32
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>
#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;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d",&n,&m);
    int a;
    int b,c;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a);
        update(1,1,n,a,i);
    }
    while(m--)
    {
        scanf("%d%d%d",&a,&b,&c);
        switch(a)
        {
            case 0:
            printf("%d\n",query(b,c,1,1,n));
            break;
            case 1:
            update(1,1,n,c,b);
            break;
        }
    }
    return 0;
}