Cod sursa(job #2432018)

Utilizator ZanoxNonea Victor Zanox Data 21 iunie 2019 16:42:09
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;

void update(vector<vector<int>> &arbint, int depth, int index, int value);
int query(vector<vector<int>> &arbint, int depth, int l1, int l2);

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

    int n,m;
    fin>>n>>m;

    vector<int> v(n);

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

    vector<vector<int>> arbint;
    arbint.push_back(v);

    int depth;

    for (int len = 2, i = 1; len <= n; len *=2, i++) {
        int currLen = n / len + (n % len != 0);
        arbint.push_back(vector<int>(currLen));

        for (int j = 0; j < currLen; j++) arbint[i][j] = max(arbint[i-1][2 * j], arbint[i-1][2 * j + 1]);

        depth = i;
    }

    for (int i = 0; i < m; i++) {
        int q, a, b;
        fin>>q>>a>>b;
        //cout<<"req: "<<q<<' '<<a<<' '<<b<<'\n';
        if (q) update(arbint, depth, a-1, b);
        else fout<<query(arbint, depth, a-1, b-1)<<'\n';
    }
}

void update(vector<vector<int>> &arbint, int depth, int index, int value) {
    arbint[0][index] = value;

    for (int i = 1; i <= depth; i++) {
        index = index / 2;
        arbint[i][index] = max(arbint[i-1][2 * index], arbint[i-1][2 * index + 1]);
    }
}

int query(vector<vector<int>> &arbint, int depth, int l1, int l2) {

    if (l2 < l1) return 0;

    int len = 1, pow = 0;
    //cout<<"initials: "<<l1<<' '<<l2<<'\n';
    while (len < (l2 - l1 + 1) / 2) {
        len *=2;
        pow++;
    }

    //cout<<"query: "<<l1<<' '<<l2<<' '<<pow<<' '<<len<<'\n';
    int lb = l2 / len * len, ub = lb + len - 1;

    return max(arbint[pow][l2 / len], max(query(arbint, depth, l1, lb - 1), query(arbint, depth, ub + 1, l2)));
}