Cod sursa(job #3128283)

Utilizator ale336-tAlexandra Toma ale336-t Data 9 mai 2023 09:19:22
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

long long d=1, s=0;

long long pow2(long long n){
    long long i =1;
    while(i<n){
        i*=2;
    }
    return i;
}

int query(int l, int r, vector <long long> &tree, int pos, int sl,int sr){
        if(l==sl && r ==sr){
            return tree[pos];
        }
        int mid = (sl+sr)/2;
        if(r <= mid){
            return query(l,r,tree,2*pos,sl,mid);
        }
        if(l > mid){
            return query(l,r,tree,2*pos+1,mid+1,sr);
        }
        int r1 = query(l,mid,tree,2*pos,sl,mid);
        int r2 = query(mid+1,r,tree,2*pos+1,mid+1,sr);
        return max(r1,r2);
}

void set_(int i, long long val, vector <long long> &tree){
    int pos = tree.size()/2+i;
    tree[pos] = val;
    pos =pos/2;
    while(pos >0){
        tree[pos] = max(tree[2*pos],tree[2*pos+1]);
        pos =pos/2;
    }
}

int main()
{
    ifstream cin{"arbori.in"};
    ofstream cout{"arbori.out"};
    long long n, m;
    cin >> n >> m;
    long long len = pow2(n)*2;
    vector <long long> tree(len,-1);
    for(int i=0; i<n; i++){
        long long val;
        cin >> val;
        set_(i,val,tree);
    }
    int k, a, b;
    for (int i=0; i<m; i+=1){
        cin >> k >> a >> b;
        if (k==0){
            int res = query(--a, --b, tree, 1, 0, (len-1)/2);
            cout<<res<<endl;
        } else if (k==1){
            set_(--a, b, tree);
        }
    }
    return 0;
}