Cod sursa(job #2386930)

Utilizator vladvaculinVlad V vladvaculin Data 23 martie 2019 22:28:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MN -1
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int a[100002], ai[400001];
void construct(int s, int d, int p){
    if(s == d){
        ai[p] = a[s];
        return ;
    }
    int mid = (s+d)/2;
    construct(s, mid, 2*p+1);
    construct(mid+1, d, 2*p+2);
    ai[p] = max(ai[2*p+1], ai[2*p+2]);

}

int query(int a, int b, int s, int d, int pos){
    if(a<=s && b>=d)
        return ai[pos];
    if(a > d || b < s)
        return MN;
    int mid = (s+d)/2;
    return max(query(a,b,s,mid,pos*2+1), query(a,b,mid+1,d, pos*2+2));
}

void update(int a, int b, int pos, int val, int n){

    if(a == b){
        ai[n] = val;
        return;
    }

    int mid = (a+b)/2;

    if(pos <= mid){
        update(a, mid, pos, val, n*2+1);
    } else {
        update(mid+1, b, pos, val, n*2+2);
    }

    ai[n] = max(ai[n*2+1], ai[n*2+2]);
}


int main(){
    fin >> n>>m;
    for(int i = 0; i<n; i++){
        fin >> a[i];
    }
    construct(0, n-1, 0);


    int q,a,b;
    for(int i = 1; i<= m; i++){
        fin >> q>> a>>b;
        if(q==0){
            fout << query(a-1,b-1,0, n-1, 0)<<"\n";
        } else {
            update(0, n-1, a-1, b, 0);
        }
    }
    return 0;
}