Cod sursa(job #2378353)

Utilizator RaresLiscanLiscan Rares RaresLiscan Data 12 martie 2019 08:48:28
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

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

int aib[100005];

void update (int idx, int val, int n)
{
    while (idx <= n) {
        aib[idx] += val;
        idx += (idx & (-idx));
    }
}

int read (int idx)
{
    int val = 0;
    while (idx > 0) {
        val += aib[idx];
        idx -= (idx & (-idx));
    }
    return val;
}

int binSearch (int sum, int n)
{
    int dr = n, st = 1;
    while (st <= dr) {
        int m = (st + dr) / 2, k = read(m);
        if (k == sum) return m;
        else {
            if (k > sum) dr = m - 1;
            else st = m + 1;
        }
    }
    return -1;
}

int main()
{
    int n, m;
    int a, b;
    fin >> n >> m;
    for (int i = 1; i <= n; i ++) {
        fin >> a;
        update(i, a, n);
    }
    for (int i = 1; i <= m; i ++) {
        fin >> a;
        if (a == 0) {
            fin >> a >> b;
            update(a, b, n);
        }
        else if (a == 1) {
            fin >> a >> b;
            fout << read(b) - read(a - 1) << "\n";
        }
        else {
            fin >> a;
            fout << binSearch(a, n) << "\n";
        }
    }
    return 0;
}