Cod sursa(job #1555804)

Utilizator antanaAntonia Boca antana Data 23 decembrie 2015 16:24:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#define MAX 100000
using namespace std;
int arbore[4*MAX+66], maxim;
inline int max(int a, int b)
{
    if(a>b)
        return a;
    return b;
}
void update(int l1, int l2, int nod, int poz, int val)
{
    int mij;
    if(l1==l2){
        arbore[nod]=val;
        return;
    }
    else
    {
        mij=(l1+l2)/2;
        if(mij<poz)
            update(mij+1, l2, nod*2+1,poz, val);
        else update(l1, mij, nod*2,poz, val);
        arbore[nod]=max(arbore[nod*2+1], arbore[nod*2]);
    }
}
void query(int l1, int l2, int a, int b, int nod)
{
    int mij;
    if(l1>=a&&l2<=b)
        maxim=max(maxim, arbore[nod]);
    else
    {
        mij=(l1+l2)/2;
        if(a<=mij) query(l1, mij, a, b, nod*2);
        if(b>mij) query(mij+1, l2, a, b, nod*2+1);
    }
}
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n, m, i, q, a, b;
    scanf("%d%d", &n, &m);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &a);
        update(1, n, 1, i, a);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d", &q, &a, &b);
        if(q==1)
            update(1, n,1,a, b);
        else
        {
            maxim=-1;
            query(1, n, a, b, 1);
            printf("%d\n", maxim);
        }
    }
    return 0;
}