Cod sursa(job #1816382)

Utilizator MarcSpataruMarc Spataru MarcSpataru Data 26 noiembrie 2016 13:44:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<cstdio>
using namespace std;
int v[100000*4];
int max(int a,int b)
{
    if(a<b)
        return b;
    return a;
}
void update(int val, int poz, int st, int dr, int poz2)
{
    int mij;
    if(st==dr)
    {
        v[poz2]=val;
        return;
    }
    mij=(st+dr)/2;
    if(poz<=mij)
        update(val,poz,st,mij,2*poz2);
    else
        update(val,poz,mij+1,dr,2*poz2+1);
    v[poz2]=max(v[2*poz2],v[2*poz2+1]);
}
int ans;
void query(int nod, int left, int right, int a, int b)
{
    if(a<=left&&right<=b)
    {
        ans=max(ans,v[nod]);
        return;
    }
    int mid=(left+right)/2;
    if(a<=mid)
        query(nod*2,left,mid,a,b);
    if(mid<b)
        query(nod*2+1,mid+1,right,a,b);
}
int vec[100001];
void build(int n)
{
    int i;
    for(i=n;i<=n*2-1;i++)
    {
        v[i]=vec[i-n+1];
    }
    int k=n/2;
    while(k!=1)
    {
        for(i=k;i<=k*2-1;i++)
        {
            v[i]=max(v[i*2],v[i*2+1]);
        }
        k/=2;
        if(k==1)
            v[1]=max(v[2],v[3]);
    }
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,i,j,f=1,t,x,y;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&vec[i]);
    for(i=1;i<=31;i++)
    {
        f*=2;
        if(n<f)
        {
            n=f;
            break;
        }
    }
    build(n);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t,&x,&y);
        if(t==0)
        {
            ans=0;
            query(1,1,n,x,y);
            printf("%d\n",ans);
        }
        if(t==1)
        {
            update(y,x,1,n,1);
        }
    }
    return 0;
}