Cod sursa(job #2187239)

Utilizator MarutBrabete Marius Stelian Marut Data 26 martie 2018 12:26:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int aint[400010];
int v[100005];
int sol=0;
 
void build(int nod,int st,int dr)
{
    if(st == dr)
        aint[nod] = v[st];
    else
    {
        int med = (st + dr) / 2;
        build(2 * nod,st,med);
        build(2 * nod + 1,med + 1,dr);
        aint[nod] = max(aint[2 * nod],aint[2*nod + 1]);
    }
}
 
void update(int nod,int st,int dr,int pozv,int new_val)
{
    if(st == dr)
        aint[nod] = new_val;
    else
    {
        int med = (st + dr) / 2;
        if(pozv <= med)
            update(2 * nod,st,med,pozv,new_val);
        if(pozv >= med + 1)
            update(2 * nod + 1,med + 1,dr,pozv,new_val);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }
}
 
void query(int nod,int st,int dr,int a,int b)
{
    if(a <= st && dr <= b)
        sol = max(sol,aint[nod]);
    else
    {
        int med = (st + dr) / 2;
        if(a <= med)
            query(2 * nod,st,med,a,b);
        if(b >= med + 1)
            query(2 * nod + 1,med + 1,dr,a,b);
    }
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,i,a,b,t;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t,&a,&b);
        if(t==1) update(1,1,n,a,b);
            else
            {
                sol=0;
                query(1,1,n,a,b);
                printf("%d\n",sol);
            }
    }
    return 0;
}