Cod sursa(job #2432465)

Utilizator ZanoxNonea Victor Zanox Data 23 iunie 2019 19:56:35
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 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);
void printarb(vector<vector<int>> &arbint, int depth);

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++) {
            if (arbint[i-1].size() > 2 * j + 1)
                arbint[i][j] = max(arbint[i-1][2 * j], arbint[i-1][2 * j + 1]);
            else arbint[i][j] = arbint[i-1][2 * j];
        }

        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';

        //printarb(arbint, depth);
    }
}

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;
        if (arbint[i-1].size() > 2 * index + 1)
            arbint[i][index] = max(arbint[i-1][2 * index], arbint[i-1][2 * index + 1]);
        else arbint[i][index] = arbint[i-1][2 * index];
    }
}

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;
    if (lb + len - 1 > l2) lb -= len;
    int ub = lb + len - 1;

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


void printarb(vector<vector<int>> &arbint, int depth) {
    for (int d = 0; d <= depth; d++) {
        for (int n : arbint[d]) {
            cout<<n;
            for (int i = 0; i < (1<<d) + d; i++) cout<<' ';
        }
        cout<<'\n';
    }
}