Cod sursa(job #3032651)

Utilizator erixEric stoicescu erix Data 22 martie 2023 16:05:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,q;
vector<int> st;
void update(int node,int from,int to,int value,int pos) {
    if(from == to) {
        st[node] = value;
        return;
    }
    int mid = (from + to) / 2;
    if(pos <= mid) {
        update(node * 2,from,mid,value,pos);;
    }else{
        update(node * 2 + 1,mid + 1,to,value,pos);
    }
    st[node] = max(st[node * 2],st[node * 2 + 1]);
}

int query(int node,int lq,int rq,int l,int r) {
    int smax = 0;
    if(lq<=l and r<=rq) return st[node];
    int mid = (l + r) / 2;
    if(lq<=mid){
        int sm = query(node * 2,lq,rq,l,mid);
        smax = max(sm,smax);
    }
    if(mid+1 <= rq) {
        int sm = query(node * 2 + 1,lq,rq,mid + 1,r);
        smax = max(smax,sm);
    }
    return smax;
}
int main()
{
    fin >> n >> q;
    st.resize(n * 4 + 5);
    int x;
    for(int i = 1;i<=n;i++) {
        fin >> x;
        update(1,1,n,x,i);
    }
    int cer,y;
    while(q--) {
        fin >> cer >> x >> y;
        if(cer == 0){
           fout << query(1,x,y,1,n) << '\n';
        }else{
            update(1,1,n,y,x);
        }
    }
    return 0;
}