Cod sursa(job #2408787)

Utilizator Alex18maiAlex Enache Alex18mai Data 18 aprilie 2019 12:40:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
//ALEX ENACHE

#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>

using namespace std;

//#include <iostream>
#include <fstream>
ifstream cin ("arbint.in");ofstream cout ("arbint.out");

int v[100100];
int arb[400100];

//pozitia nodului actual , st si dr intervalului corespunzator nodului ,
//pozitia pe care inserez , valoarea inserata
void update(int nod , int st , int dr , int pos , int val){

    //cand ajung la o frunza
    if (st == dr){
        arb[nod] = val;
        return;
    }
    int mij = st + dr;
    mij /= 2;
    if (pos <= mij){
        update (nod*2 , st , mij , pos , val);
    }
    else{
        update (nod*2+1 , mij+1 , dr , pos , val);
    }
    arb[nod] = max(arb[nod*2] , arb[nod*2+1]);
}

//pozitia nodului actual , st si dr intervalului corespunzator nodului ,
//ST si DR intervalului pe care vrem maxim

int query (int nod , int st , int dr , int ST , int DR){

    //cand intervalul nodului este cuprins in intervalul pe care vrem maxim
    if (st >= ST && dr <= DR){
        return arb[nod];
    }
    int mij = st + dr;
    mij /= 2;

    int MAX = 0;
    if (ST <= mij){
        MAX = max(MAX , query (nod*2 , st , mij , ST , DR));
    }
    if (mij < DR){
        MAX = max(MAX , query (nod*2+1 , mij+1 , dr , ST , DR));
    }
    return MAX;
}

int main() {

    //freopen("input", "r", stdin);freopen("output", "w", stdout);

    //nr pozitii , nr intrebari
    int n , m;
    cin>>n>>m;

    //elementele initiale
    for (int i=1; i<=n; i++){
        cin>>v[i];
        update (1 , 1 , n , i , v[i]);
    }

    for (int i=1; i<=m; i++){
        int t , a , b;
        cin>>t>>a>>b;
        if (t == 1){
            update (1 , 1 , n , a , b);
        }
        else{
            cout<<query(1 , 1 , n , a , b)<<'\n';
        }
    }




    return 0;
}