Pagini recente » Cod sursa (job #809526) | Cod sursa (job #2371059) | Cod sursa (job #2750237) | Cod sursa (job #570994) | Cod sursa (job #2776537)
#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;
}