Cod sursa(job #2244362)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 22 septembrie 2018 17:21:27
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>

const int MAXN = 1e5 * 4 + 5;

using namespace std;

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

int arbint[MAXN],v[MAXN],n,q;
//default arguments (nici eu nu stiam)
///https://en.cppreference.com/w/cpp/language/default_arguments

void upd(int pos,int value,int nod = 1,int left = 1,int right = n){
    if(left == right){
        arbint[nod] = value;
        return;
    }
    int mij = (left + right) / 2;
    if(pos <= mij)
        upd(pos,value,nod * 2,left,mij);
    else
        upd(pos,value,nod * 2 + 1,mij + 1,right);
    arbint[mij] = max(arbint[nod * 2], arbint[nod * 2 + 1]);
}
int query(int qa,int qb,int nod = 1,int left = 1,int right = n){
    if(qa <= left && right <= qb)
        return arbint[nod];
    int mij = (left + right) / 2,maxim = 0;
    if(qa <= mij)
        maxim = max(maxim,query(qa,qb,nod * 2,left,mij));
    if(mij < qb)
        maxim = max(maxim,query(qa,qb,nod * 2 + 1,mij + 1,right));
    return maxim;
}


int main()
{
    in>>n>>q;
    for(int i = 1; i <= n; i++){
        in>>v[i];
        upd(i,v[i]);
    }
    for(int i = 1; i <= q; i++){
        int type,a,b;
        in>>type>>a>>b;
        if(type == 1)
            upd(a,b);
        else
            out<<query(a,b)<<"\n";
    }
    return 0;
}