Cod sursa(job #3139174)

Utilizator CrobertCCampeanu Robert CrobertC Data 25 iunie 2023 19:59:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

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

struct tree{
    tree* left;
    tree* right;
    long mx;
    long mn;
};

long n, m;
long leafs[100001];
long nodes[400001];

void build(long nn, long l, long r){
    if(l==r){
        nodes[nn]=leafs[l];
    }
    else{
        long m = (l+r)/2;
        build(nn*2, l, m);
        build((nn*2)+1, m+1, r);
        nodes[nn] = max(nodes[nn*2], nodes[(nn*2)+1]);
    }
}

long query(long nn, long l, long r, long ql, long qr){
    if(ql<=l && r<=qr){
        return nodes[nn];
    }
    int m=(l+r)/2;
    if(qr<=m)
        return query(nn*2, l, m, ql, qr);
    if(m+1<=ql)
        return query((nn*2)+1, m+1, r, ql, qr);
    return max(query(nn*2, l, m, ql, qr), query((nn*2)+1, m+1, r, ql, qr));
}


void update(long nn, long l, long r, long pos, long rep){
    if(l == pos && r == pos){
        nodes[nn]=rep;
    }
    else{
        long m=(l+r)/2;
        if(pos<=m)
            update(nn*2, l, m, pos, rep);
        else{
            update((nn*2)+1, m+1, r, pos, rep);
        }
        nodes[nn] = max(nodes[nn*2], nodes[(nn*2)+1]);
    }
}

int main()
{
    fin>>n>>m;
    for(long i=1;i<=n;i++){
        fin>>leafs[i];
    }
    build(1, 1, n);
    int q, l, r;
    for(long i=1;i<=m;i++){
        fin>>q>>l>>r;
        if(q==0){
            fout<<query(1, 1, n, l, r)<<'\n';
        }
        else if(q==1){
            update(1, 1, n, l, r);
        }
    }
    return 0;
}