Cod sursa(job #1037347)

Utilizator macajouMaca George macajou Data 20 noiembrie 2013 01:48:36
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <cstring>
#define nmax 200010
#define inf 1<<30

using namespace std;
int n,m,a[nmax],max;

int maxim(int a, int b)
{
    if(a>b)
       return a;
    return b;
}

void adaugare(int nod, int st, int dr, int poz, int val)
{
    int mij;
    if(st==dr)
       {
           a[nod]=val;
           return;
       }
    else
        {
            mij=(st+dr)/2;
            if(poz<=mij)
               adaugare(nod*2,st,mij,poz,val);
            else adaugare(nod*2+1,mij+1,dr,poz,val);
            a[nod]=maxim(a[2*nod],a[2*nod+1]);
        }
}

void interogare(int nod, int st, int dr, int x, int y)
{
    if(x<=st && y>=dr)
       {
           max=maxim(a[nod],max);
           return;
       }
    int mij=(st+dr)/2;
    if(x<=mij)
       interogare(2*nod,st,mij,x,y);
    if(y>mij)
       interogare(2*nod+1,mij+1,dr,x,y);
}

void citire()
{
    scanf("%d%d",&n,&m);
    int i,x;
    for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            adaugare(1,1,n,i,x);
        }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    int op,x,y,rez;
    citire();
    for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&op,&x,&y);
            if(op==1)
               adaugare(1,1,n,x,y);
            else
                {
                    max=-1;
                    interogare(1,1,n,x,y);
                    printf("%d\n",max);
                }
        }

    return 0;
}