Cod sursa(job #3290342)

Utilizator wiki__Andrei Alecu izsak wiki__ Data 30 martie 2025 14:31:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#include <unordered_map>
#include <climits>
#include <cmath>
#include <algorithm>
#pragma GCC optimize("O3,Ofast,unroll-loops")
using namespace std;

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

const int NMAX = 2e5+5;
int Tree[NMAX],n;

void Build() {
    for (int i=n; i<n*2; i++) {
        cin>>Tree[i];
    }
    for (int i=n-1; i>0; i--) {
        Tree[i] = max(Tree[i*2],Tree[i*2+1]);
    }
}

void Update(int i,int val) {
    i += n;
    Tree[i] = val;
    while (i > 1) {
        i /= 2;
        Tree[i] = max(Tree[i*2],Tree[i*2+1]);
    }
}

int querry(int i,int j) {
    i += n;
    j += n;
    int rez = INT_MIN;
    while (i < j) {
        if (i%2 == 1) {
            rez = max(rez,Tree[i]);
            i++;
        }
        if (j%2 == 1) {
            j--;
            rez = max(rez,Tree[j]);
        }
        i /= 2;
        j /= 2;
    }
    return rez;
}

int main() {
    int k;
    cin>>n>>k;
    Build();

    for (int i=0; i<k; i++) {
        int a,b,c;
        cin>>a>>b>>c;
        if (a == 1) {
            Update(b-1,c);
        }
        else {
            cout<<querry(b-1,c)<<"\n";
        }
    }
}