Cod sursa(job #2776537)

Utilizator 23liviuStanescu Liviu 23liviu Data 20 septembrie 2021 09:20:27
Problema Arbori indexati binar Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>

using namespace std;

template <class T_Data, class T_Over>
class FenwickTree
{
public:
    vector<T_Data> data;

    int GetParent(int i) { return i - (i & (-i)); }
    int GetNext(int i) { return i + (i & (-i)); }

    T_Over GetSum(int i)
    {
        T_Over sum = 0;
        while(i > 0)
        {
            sum += data[i];
            i = GetParent(i);
        }
        return sum;
    }

    void Add(int i, T_Data delta)
    {
        ++i;
        while(i < data.size())
        {
            data[i] += delta;
            i = GetNext(i);
        }
    }

    FenwickTree(int capacity) : data(capacity + 1, 0){}
};

int oper2(int tar, int n, FenwickTree<int,int>* aib)
{
    int st = 1,dr = n;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        int sum = (*aib).GetSum(mij);
        if(sum == tar)
            return mij;
        if(sum < tar)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    return -1;
}



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

    int n, m;
    cin >> n >> m;
	FenwickTree<int, int> aib = *(new FenwickTree<int, int>(n));
    for(int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		aib.Add(i, x);
	}

    for(int i = 0; i < m; i++)
	{
		int op, a, b;
		cin >> op >> a;
		if(op == 0)
		{
			cin >> b;
			aib.Add(a, b);
		}
		else if(op == 1)
		{
			cin >> b;
			cout << aib.GetSum(b) - aib.GetSum(a-1) << "\n";
		}
		else
		{
			cout << oper2(a, n, &aib) << "\n";
		}
	}
    return 0;
}