Cod sursa(job #3368812)

Utilizator JenJenCristache Ion JenJen Data 15 octombrie 2026 21:40:02
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
using namespace std;

#define MAX 100005
ifstream cin ("aib.in");
ofstream cout ("aib.out");

int n;
int v[MAX];
long long aib[MAX];
int m;
int c, b;
long long a;

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

long long query(int poz)
{
    long long s = 0;
    while (poz > 0)
    {
        s += aib[poz];
        poz -= (poz & (-poz));
    }

    return s;
}


long long cb(long long val)
{
    long long sol = 0;
    long long s = 0;

    for(int pas = (1 << 17); pas > 0; pas >>= 1)
    {
        if(sol + pas <= n && s + aib[sol + pas] < val)
        {
            sol += pas;
            s += aib[sol];
        }
    }

    long long rez = sol + 1;

    if (rez <= n && query(rez) == val)
    {
        return rez;
    }

    return -1;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
        update(i, v[i]);
    }

    for (int i = 1; i <= m; i++)
    {
        cin >> c;
        if (c == 0)
        {
            cin >> a >> b;
            update(a, b);
        }
        else if (c == 1)
        {
            cin >> a >> b;
            cout << query(b) - query(a - 1) << '\n';
        }
        else
        {
            cin >> a;
            long long k = cb(a);
            cout << k << '\n';
        }
    }
    return 0;
}