Cod sursa(job #3201017)

Utilizator diana_dd03Dorneanu Diana diana_dd03 Data 6 februarie 2024 15:58:14
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, cer, x, y;
int arb[400005], v[100005];

/*void build(int nod, int st, int dr){
    if(st==dr){
        arb[st]=nod;
        return;
    }
    int mij=(st+dr)/2;
    build(2*nod, st, mij);
    build(2*nod+1, mij+1, dr);
    arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}*/

void update(int nod, int val, int poz, int st, int dr){
    //cout<<nod<<" "<<poz<<" "<<st<<" "<<dr<<"\n";
    if(st==dr){
        arb[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        update(2*nod, val, poz, st, mij);
    else
        update(2*nod+1, val, poz, mij+1, dr);

    arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}

int query(int nod, int x, int y, int st, int dr){
    //cout<<nod<<" "<<x<<" "<<y<<" "<<st<<" "<<dr<<"\n";
    if(x==st && y==dr)
        return arb[nod];

    int mij=(st+dr)/2;
    if(x>mij)
        return query(2*nod+1, x, y, mij+1, dr);

    else if(y<=mij)
        return query(2*nod, x, y, st, mij);

    else
        return max(query(2*nod+1, mij+1, y, mij+1, dr),
                   query(2*nod, x, mij, st, mij));
}


int main(){
    fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        update(1, v[i], i, 1, n);
    }
    for(int i=1;i<=m;i++){
        fin>>cer>>x>>y;
        ///      poz val
        if(cer==1)
            update(1, y, x, 1, n);

        else
            fout<<query(1, x, y, 1 ,n)<<'\n';
    }
    return 0;
}