Pagini recente » Cod sursa (job #1911726) | Cod sursa (job #152596) | Cod sursa (job #2608408) | Cod sursa (job #239607) | Cod sursa (job #2789229)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define inf 1e9 + 1
const int CAPACITY = 100013;
int lsb(int x)
{
return x & (-x);
}
class FenwickTree
{
private:
int n;
int tree[CAPACITY];
int querySum(int idx)
{
int sum = 0;
for (int i = idx; i > 0; i -= lsb(i))
{
sum += tree[i];
}
return sum;
}
public:
FenwickTree(int n)
{
this->n = n;
fill(tree, tree + n, 0);
}
void set(int idx, int val)
{
for (int i = idx; i <= n; i += lsb(i))
{
tree[i] += val;
}
}
int query(int left, int right)
{
return querySum(right) - querySum(left - 1);
}
int kthSum(int val)
{
int l = 1;
int r = n;
int temp = -1;
while (l <= r)
{
int mid = (l + r) / 2;
int currVal = querySum(mid);
if (currVal == val)
{
temp = mid;
r = mid - 1;
}
else if (currVal > val)
{
r = mid - 1;
}
else if (currVal < val)
{
l = mid + 1;
}
}
return temp;
}
};
int main()
{
int n, m, op, a, b;
fin >> n >> m;
FenwickTree fenTree(n);
for (int i = 1; i <= n; ++i)
{
fin >> a;
fenTree.set(i, a);
}
while (m-- > 0)
{
fin >> op;
if (op == 0)
{
fin >> a >> b;
fenTree.set(a, b);
}
else if (op == 1)
{
fin >> a >> b;
fout << fenTree.query(a, b) << "\n";
}
else if (op == 2)
{
fin >> a;
fout << fenTree.kthSum(a) << "\n";
}
}
return 0;
}