Cod sursa(job #1032918)

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

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

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;
    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]);
        }
}

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

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

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;
    memset(a,-inf,sizeof(a));
    citire();
    for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&op,&x,&y);
            if(op==0)
               printf("%d\n",interogare(1,1,n,x,y));
            else inloc(1,1,n,x,x,y);
        }

    return 0;
}