Cod sursa(job #2901873)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 14 mai 2022 17:40:50
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdint>
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int n, m;
int v[100005];

void Update(int pos, uint32_t val) {
    for (; pos <= n; pos += pos & (-pos)) {
        v[pos] += val;
    }
}

uint32_t Query(uint32_t pos) {
    uint32_t sum = 0;
    for (; pos > 0; pos -= pos & (-pos)) {
        sum += v[pos];
    }
    return sum;
}

uint32_t Query(int a, int b) {
    return Query(b) - Query(a - 1);
}

uint32_t BinarySearch(uint32_t val) {
    uint32_t sum = 0;
    int idx = 0;
    uint32_t pow = 1 << (int)(log2(n));
    while (pow > 0) {
        if (idx + pow <= n && sum + v[idx + pow] <= val) {
            sum += v[idx + pow];
            idx += pow;
        }
        pow /= 2;
    }

    if (sum != val) {
        return -1;
    }
    return idx;
}


int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        uint32_t val;
        fin >> val;
        Update(i, val);
    }

    for (int i = 1; i <= m; i++) {
        int t, a, b;
        fin >> t;
        if (t == 0) {
            fin >> a >> b;
            Update(a, b);
        }
        else if (t == 1) {
            fin >> a >> b;
            fout << Query(a, b) << '\n';
        }
        else {
            fin >> a;
            fout << BinarySearch(a) << '\n';
        }
    }
}