Cod sursa(job #2513321)

Utilizator patrickdanDan patrick patrickdan Data 22 decembrie 2019 21:17:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include<algorithm>

using namespace std;
int vv[100005];
int t[400005];
void build(int v,int tl , int tr)
{
    if(tl==tr)
        t[v]=vv[tl];
    else
    {
        int tm=(tl+tr)/2;
        build(2*v,tl,tm);
        build(2*v+1,tm+1,tr);
        t[v]=max(t[2*v],t[2*v+1]);
    }
}
int getmax(int v, int tl , int tr ,int l , int r)
{
    if(l>r)
        return -1;
    if(l==tl && r==tr)
        return t[v];
    int tm=(tl+tr)/2;
    return max(getmax(2*v,tl,tm,l,min(r,tm)),getmax(2*v+1,tm+1,tr,max(l,tm+1),r));
}
void update(int v,int tl , int tr, int pos,int val)
{
    if(tl==tr)
        t[v]=val;
    else
    {
        int tm=(tl+tr)/2;
        if(pos<=tm)
          update(v*2, tl, tm, pos,val);
        else
            update(v*2+1,tm+1,tr,pos,val);
        t[v]=max(t[2*v],t[2*v+1]);
    }
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m;
    scanf("%d",&n);
    scanf("%d",&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&vv[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int t,a,b;
        scanf("%d%d%d",&t,&a,&b);
        if(t==0)
            printf("%d\n",getmax(1,1,n,a,b));
        else
            update(1,1,n,a,b);
    }
    return 0;
}