Cod sursa(job #2831500)

Utilizator VladS23Vlad Seba VladS23 Data 11 ianuarie 2022 16:01:26
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

ifstream cin("aib.in");
ofstream cout("aib.out");

const int NMAX = 1e5;

vector<int> aib(NMAX + 5);

int n, m;

int last_bit(int x)
{
    return x & (-x);
}
void update(int x, int a)
{
    for (int i = x; i < aib.size(); i += last_bit(i))
    {
        aib[i] += a;
    }
}

int query(int x)
{
    int sol = 0;
    for (int i = x; i >= 1; i -= last_bit(i))
        sol += aib[i];
        return sol;
}

int bs(int k)
{
    int pas = (1 << 17);
    int ans = 0, sum = 0;
    for ( ; pas > 0; pas >>= 1)
    {
        if (ans + pas >= n + 1) continue;
        if (sum + aib[ans + pas] <= k)
        {
            ans += pas;
            sum += aib[ans];
        }
    }
    if (sum != k)
        return -1;
    return ans;
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        int a;
        cin >> a;
        update(i, a);
    }
    for (int i = 1; i <= m; i++)
    {
        int t, a, b;
        cin >> t;
        if (t == 0)
            {
            cin >> a >> b;
            update(a, b);
        }
        if (t == 1)
        {
            cin >> a >> b;
            cout << query(b) - query(a - 1) << '\n';
        }
        if (t == 2)
        {
            cin >> a;
            cout << bs(a) << '\n';
        }
    }
    return 0;
}