Cod sursa(job #2487988)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 5 noiembrie 2019 22:18:21
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int getTreeSize(int n){
    int s = 1;
    while(s<n){
        s *= 2;
    }
    return s;
}

void updateSegTree(int idx, int val, vector<int> &tree){
    tree[idx]=val;
    idx /= 2;
    while(idx > 0){
        tree[idx] = max(tree[2*idx], tree[2*idx+1]);
        idx /= 2;
    }
}
int ans = -1;
void querySegment(int left, int right, int idx, int queryLeft, int queryRight, vector<int> tree){
    if(queryLeft <= left && right <= queryRight){
        ans = max(tree[idx], ans);
        return;
    }
    int middle = (left+right)/2;
    if(queryLeft <= middle)
        querySegment(left, middle, 2*idx, queryLeft, queryRight, tree);
    if(queryRight > middle)
        querySegment(middle+1, right, 2*idx + 1, queryLeft, queryRight, tree);
}

void printVec(vector<int> V){
    for(int a : V){
        printf("%d ", a);
    }
    puts("");
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int n, m, aux;
    cin>>n>>m;

    int treeSize = getTreeSize(n);
    vector<int> segnemtTree(2*treeSize);
    for(int i=0; i<n; i++){
        cin>>aux;
        segnemtTree[treeSize + i] = aux;
    }
    for(int t=treeSize-1; t>0; t--){
        segnemtTree[t] = max(segnemtTree[2*t], segnemtTree[2*t+1]);
    }
    //printVec(segnemtTree);

    int qType, p1, p2;
    while(m--){
        cin>>qType>>p1>>p2;
        if(qType){
            updateSegTree(treeSize+p1-1, p2, segnemtTree);
            //printVec(segnemtTree);
        }
        else{
            ans = -1;
            querySegment(1, treeSize, 1, p1, p2, segnemtTree);
            printf("%d\n", ans);
        }
    }
    return 0;
}