Cod sursa(job #3003841)

Utilizator AndPitAndreeaPiticar AndPit Data 15 martie 2023 23:01:10
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
using namespace std;
ifstream f("arbint..in");
ofstream g("arbint..out");
const int nmx=100000;
int v[nmx+5],n;
int tree[nmx*2+5];
/// function to build the tree
void build(int arr[]){
    /// insert leaf nodes in tree
    for(int i=0;i<=n;i++)
        tree[n+i]=arr[i];
    /// build the tree by calculating parents
    for(int i=n;i>0;--i)
        tree[i]=max(tree[i<<1],tree[i<<1 | 1]);
}
/// function to update a tree node
void updateTreeNode(int p,int value){
    /// set value at position p
    tree[p+n]=value;
    p=p+n;
    /// move upward and update parents
    for(int i=p;i>1;i>>=1)
        tree[i>>1]=max(tree[i],tree[i^1]);
}
/// function to get sum on interval [l, r)
int query(int l,int r){
    int res=0;
    /// loop to find the sum in the range
    for(l+=n,r+=n;l<r;l>>=1,r>>=1){
        if(l&1)
            res=max(res,tree[l++]);
        if(r&1)
            res=max(res,tree[--r]);
    }
    return res;
}
int main(){
    int m;
    f>>n>>m;
    for(int i=1;i<=n;++i)
        f>>v[i];
    build(v);
    /*g<<'*';
    for(int i=1;i<=2*n;++i)
        g<<tree[i]<<" ";
    g<<'\n';*/
    for(;m>0;--m){
        int cer,a,b;
        f>>cer>>a>>b;
        if(cer==0)
            g<<query(a,b+1)<<'\n';
        else{
            updateTreeNode(a,-v[a]);
            updateTreeNode(a,b);
        }
        /*g<<'*';
        for(int i=1;i<=2*n;++i)
            g<<tree[i]<<" ";
        g<<'\n';*/
    }
    return 0;
}