Cod sursa(job #2752413)

Utilizator pizzandreeaCiurescu Andreea pizzandreea Data 17 mai 2021 21:59:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#define INF -2

using namespace std;

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

int tree[400000], v[100001];
int type, ind, value;
int n, m;
int sol;
int x, y;

void build( int left, int right, int node){

    if(left == right){
        tree[node] = v[left];
    }
    else{

        int mid = (left + right) / 2;
        build(left, mid, 2 * node);
        build( mid + 1, right, 2 * node + 1);
        tree[node] = max( tree[2*node], tree[2 * node + 1]);
    }
}


void query(int left, int right, int node){
    if(x <= left && y >= right){
        sol = max( sol, tree[node]);
    }
    else{

        int mid = (left + right) / 2;

        if( x <= mid) query( left, mid, 2*node);

        if( y > mid) query(mid+1, right, 2*node + 1);
    }
}


void update(int left, int right, int node){
    
    if ( left == right ){
		tree[node] = v[left];
        return ;
    }

    int mid;
    mid = (left + right) / 2;

    if(ind <= mid){
        update( left, mid, 2*node);
    }
    else
        update( mid + 1, right, 2 * node + 1);

    tree[node] = max(tree[2*node], tree[2*node + 1]);
}


int main(){

    fin >> n >> m;

    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }

    build( 1, n, 1);

    for(int i = 1; i <= m; i++){
        fin >> type >> ind >> value;

        if(!type){
            sol = INF;
            x = ind; y = value;
            query( 1, n, 1);
            fout << sol <<"\n";
        } 
        else{
            v[ind] = value;
            update( 1, n, 1);
        }
        
    }

    fin.close();
    fout.close();
    return 0;
}