Cod sursa(job #3128520)

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

using namespace std;

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

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

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

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