Cod sursa(job #2776651)

Utilizator betybety bety bety Data 20 septembrie 2021 16:38:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int lim=1e6+3;
int tree[4*lim];
int v[lim];
void build(int nod,int l,int r)
{
    if(l==r)
    {
        tree[nod]=v[l];
        return ;
    }
    int med=(l+r)>>1;
    build(2*nod,l,med);
    build(2*nod+1,med+1,r);
    tree[nod]=max(tree[2*nod],tree[2*nod+1]);
}
void update(int nod,int l,int r,int a,int b)
{
    if(l==r)
    {
        tree[nod]=b;
        return ;
    }
    int med=(l+r)>>1;
    if(a<=med) update(2*nod,l,med,a,b);
    else update(2*nod+1,med+1,r,a,b);
    tree[nod]=max(tree[2*nod],tree[2*nod+1]);
}
int query(int nod,int l,int r,int a,int b)
{
    if(a<=l and r<=b)
        return tree[nod];
    int ans1=0,ans2=0;
    int med=(l+r)>>1;
    if(a<=med) ans1=query(2*nod,l,med,a,b);
    if(b>med) ans2=query(2*nod+1,med+1,r,a,b);
    return max(ans1,ans2);
}
int n,q,c,a,b;
int main()
{
    in>>n>>q;
    for(int i=1;i<=n;++i)
        in>>v[i];
    build(1,1,n);
    while(q--)
    {
        in>>c>>a>>b;
        if(c==0)
            out<<query(1,1,n,a,b)<<'\n';
        else update(1,1,n,a,b);
    }
    return 0;
}