Cod sursa(job #1692508)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 20 aprilie 2016 23:29:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <cstdio>
using namespace std;
int v[100001],arbore[262144];
void upd(int n,int st,int dr,int x,int val )
{if(st==dr){arbore[n]=val;return;}
    int m=(st+dr)/2;
if( x>m )upd(2*n+1,m+1,dr,x,val);
else{upd(2*n,st,m,x,val);}


 arbore[n]=arbore[2*n]>arbore[2*n+1]? arbore[2*n]:arbore[2*n+1];
}
int query (int n,int st,int dr,int a,int b )
{
    if(a<=st&&dr<=b)return arbore[n];
    int m=st+dr,aux=0,p=0;
    m=m/2;
    if(a<=m)aux=query(2*n,st,m,a,b);
    if(b>m)p=query(2*n+1,m+1,dr,a,b);
    return aux>p? aux:p;
}

int main()
{freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int a,b,i,j,n,p,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d",v+i);
//pre lucru 262144
for(i=1;i<=n;i++)
{
    upd(1,1,n,i,v[i]);
}
for(i=0;i<m;i++)
{
    scanf("%d%d%d",&p,&a,&b);
    if(p==0)
    {
        printf("%d\n",query(1,1,n,a,b));
    }
    else
    {
        upd(1,1,n,a,b);
    }

}

    return 0;
}