Cod sursa(job #190790)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 24 mai 2008 08:11:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>


long a[400100];
long maxim,i,n,m,q,w,x;

int max(int e, int r)
{
        if (e<r) return r;
        else return e;
}

void update(int nod, int st, int dr, int poz, int x)
{
        if (st==dr) a[nod]=x;
        else {
                int mij=(st+dr) >> 1;
                if (poz<=mij) update(nod*2,st,mij,poz,x);
                else update(nod*2+1,mij+1,dr,poz,x);
                a[nod]=max(a[nod*2],a[nod*2+1]);
             }
}

void query(int nod, int st, int dr)
{
        if (q<=st&&dr<=w)
         { if (maxim<a[nod]) maxim=a[nod]; return;}
        else {
                int mij=(st+dr)/2;
                if (q<=mij) query(nod*2,st,mij);
                if (mij<w) query(nod*2+1,mij+1,dr);
             }
}

int main()
{
        freopen("arbint.in","r",stdin);
        freopen("arbint.out","w",stdout);
        scanf("%ld %ld",&n , &m);
        for (i=1; i<=n; ++i)
        {
                scanf("%ld",&x);
                update(1,1,n,i,x);
        }
        for (i=1; i<=m; ++i)
        {
               scanf("%ld %ld %ld",&x,&q,&w);
               if (x==0)
               {        maxim=-100;
                        query(1,1,n);
                        printf("%ld\n",maxim);
               }
               else
                update(1,1,n,q,w);
        }
        fclose(stdin); fclose(stdout);
        return 0;
}