Cod sursa(job #1077330)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 11 ianuarie 2014 11:08:43
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#define dmax 1000000010
using namespace std;
int v[400100];

inline int max(int a, int b)
{
    return a>b?a:b;
}
void update(int nod, int poz, int x, int st, int dr)
{
    if (st==dr) v[nod]=x;
    else {
        int m=st+(dr-st)/2;
        if (poz<=m) update(2*nod,poz,x,st,m);
        else update(2*nod+1,poz,x,m+1,dr);
        v[nod]=max(v[2*nod],v[2*nod+1]);
    }

}
int query(int nod, int st, int dr, int a, int b)
{
    int x=0,y=0;
    if (st>=a && dr<=b) return v[nod];
    else {
        int m=st+(dr-st)/2;
        if (m>=a) x=query(2*nod,st,m,a,b);
        if (m+1<=b) y=query(2*nod+1,m+1,dr,a,b);
        return max(x,y);
    }
}
int main()
{
    int n,m,x,y,z;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d", &n, &m);

    for (int i=1;i<=n;i++)
    {
        scanf("%d", &x);
        update(1,i,x,1,n);
    }
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d", &x, &y, &z);
        if (x==0) printf("%d\n",query(1,1,n,y,z));
        if (x==1) update(1,y,z,1,n);
    }
    return 0;
}