Cod sursa(job #2596094)

Utilizator CharacterMeCharacter Me CharacterMe Data 9 aprilie 2020 11:36:06
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>

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

int n, q;
int segmTree[400005];

void update(int val, int target, int a, int b, int pos);
int query(int lft, int rgt, int a, int b, int pos);

int main()
{

    fin >> n >> q;

    for(int i = 1; i <= n; ++i){
        int x;
        fin >> x;

        update(x, i, 1, n, 1);
    }

    while(q--){
        int task;
        fin >> task;

        if(task){
            int a, b;
            fin >> a >> b;

            update(b, a, 1, n, 1);
        }
        else{
            int a, b;
            fin >> a >> b;

            fout << query(a, b, 1, n, 1) << "\n";
        }
    }

    return 0;
}

void update(int val, int target, int a, int b, int pos){
    if(a == b){
        segmTree[pos] = val;
        return;
    }

    int mid = (a + b) / 2;
    if(target <= mid) update(val, target, a, mid, 2 * pos);
    else update(val, target, mid + 1, b, 2 * pos + 1);

    segmTree[pos] = max(segmTree[2 * pos], segmTree[2 * pos + 1]);
}

int query(int lft, int rgt, int a, int b, int pos){
    if(a == lft && b == rgt) return segmTree[pos];

    int mid = (a + b) / 2;
    if(rgt <= mid) return query(lft, rgt, a, mid, 2 * pos);
    else if(lft > mid) return query(lft, rgt, mid + 1, b, 2 * pos + 1);
    else return max(query(lft, mid, a, mid, 2 * pos), query(mid + 1, rgt, mid + 1, b, 2 * pos + 1));
}