Cod sursa(job #3177953)

Utilizator MihneaStoicaMihnea Teodor Stoica MihneaStoica Data 30 noiembrie 2023 17:46:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <vector>

using namespace std;

struct _AIB
{
	vector<int> bit;
	_AIB (int newsize) {
		bit.resize (newsize + 1);
	}
	_AIB ();
	void update (int i, int val) {
		while (i < bit.size()) {
			bit[i] += val;
			i += (i & -i);
		}
	}
	int range (int i, int j) {
		return prefixsum (j) - prefixsum (i - 1);
	}
	int prefixsum (int i) {
		int sum = 0;

		while (i > 0) {
			sum += bit[i];
			i -= (i & -i);
		}

		return sum;
	}
};

int main()
{
    ifstream cin ("aib.in");
    ofstream cout ("aib.out");
    //ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    //cout.tie(NULL);
    int n, q; cin >> n >> q;
    _AIB aib(n);
    for (int i = 1; i <= n; i ++)
    {
        int a; cin >> a;
        aib.update(i, a);
    }
    for (int i = 1; i <= q; i ++)
    {
        int nr; cin >> nr;
        int s;
        int a, b, lo = 0, hi = n + 1;
        bool ok = 0;
        switch (nr)
        {
        case 0:
            cin >> a >> b;
            aib.update(a, b);
            break;
        case 1:
            cin >> a >> b;
            cout << aib.range(a, b) << '\n';
            break;
        case 2:
            cin >> s;
            lo = 0;
            hi = n + 1;

            while (lo + 1 < hi)
            {
                int mid = (lo + hi) / 2, val = aib.prefixsum(mid);
                if (val == s)
                {
                    cout << mid << '\n';
                    ok = 1;
                    break;
                }
                else if (val > s)
                {
                    hi = mid;
                }
                else
                {
                    lo = mid;
                }
            }
            if (!ok) cout << -1 << '\n';
            break;
        default:
            break;
        }
    }
}

/**

6
72 54 25 64 87 15

*/