Cod sursa(job #2629190)

Utilizator betybety bety bety Data 19 iunie 2020 14:15:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int lim=1e5;
int tree[4*lim+3],v[lim];
void build(int nod,int l,int r)
{
    if(l>r) return;
    if(l==r) {tree[nod]=v[l];return;}
    int med=(l+r)/2;
    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 poz,int val)
{
    if(l>r) return;
    if(l==r) {tree[nod]=val;return;}
    int med=(l+r)/2;
    if(poz<=med) update(2*nod,l,med,poz,val);
    else update(2*nod+1,med+1,r,poz,val);
    tree[nod]=max(tree[2*nod],tree[2*nod+1]);
}
int query(int nod,int l,int r,int x,int y)
{
    if(l>r) return -2e9;
    if(x<=l and r<=y) return tree[nod];
    int med=(l+r)/2;
    int ans1=-2e9,ans2=-2e9;
    if(x<=med)
        ans1=query(2*nod,l,med,x,y);
    if(y>med)
        ans2=query(2*nod+1,med+1,r,x,y);
    return max(ans1,ans2);
}
int main()
{
    int n,m,tip,x,y;
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        cin>>v[i];
    build(1,1,n);
    while(m--)
    {
        cin>>tip>>x>>y;
        if(tip) update(1,1,n,x,y);
        else cout<<query(1,1,n,x,y)<<'\n';
    }
    return 0;
}