Cod sursa(job #2963189)

Utilizator Vincent47David Malutan Vincent47 Data 10 ianuarie 2023 11:33:48
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

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

    int n;
    const int NMAX = 100000;
    int aib[NMAX];

    void update(int p,  int v)
    {
        for (int i = p; i <= n; i += i & - i)
            aib[i] += v;
    }

    int query(int p)
    {
        int sum = 0;
        for (int i = p; i; i -= i & -i)
            sum += aib[i];

        return sum;
    }



int main()
{
    int m, i, x, tip, p, a, b;
    cin >> n >> m;

    for (i = 1; i <= n; ++i) {
        cin >> x;
        update(i, x);
    }

    for(i = 1; i <= m; ++i) {

        cin >> tip;
        if (tip == 0)
        {
            cin >> p >> x;
            update(p, x);
        }

        else if (tip == 1)
        {
            cin >> a >> b;
            cout << query(b) - query(a - 1) << '\n';
        }

        else {
            cin >> x;
            int st = 1, dr = n;

            while (true) {
                int m = (st + dr) / 2;
                int r = query(m);
                if (r == x)
                {
                    cout << m << '\n';
                    break;
                }

                else if (r > x)
                    dr = m - 1;
                else
                    st = m + 1;
            }
        }

    }
    return 0;
}

/*
8 3
25 42 8 15 1 55 16 67
0 5 12
2 25
2 90
1 7 7
1 2 8
2 241
*/