Pagini recente » Cod sursa (job #3229565) | Cod sursa (job #2654139) | Cod sursa (job #2422202) | Cod sursa (job #2242251) | Cod sursa (job #2525012)
#include <bits/stdc++.h>
#define zeros(x) ((x ^ (x - 1)) & x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int nmax = 1e5 + 5;
class BinaryIndexedTree
{
private:
int tree[nmax];
int n;
int powMax;
int findPow()
{
int pow = 1;
while (pow < n)
pow <<= 1;
return pow;
}
public:
BinaryIndexedTree(int n)
{
this -> n = n;
this -> powMax = findPow();
}
void update(int id, int val)
{
for (int node = id; node <= n; node += zeros(node))
tree[node] += val;
}
int prefixSum(int id)
{
int sum = 0;
for (int node = id; node > 0; node -= zeros(node))
sum += tree[node];
return sum;
}
int query(int val)
{
int pow = powMax;
int i = 0;
while (pow > 0)
{
if (i + pow <= n)
if (tree[i + pow] <= val)
{
val -= tree[i + pow];
i += pow;
if (val == 0)
return i;
}
pow >>= 1;
}
return -1;
}
};
int main()
{
int n, m;
f >> n >> m;
auto Tree = new BinaryIndexedTree(n);
for (int i = 1; i <= n; ++ i)
{
int x;
f >> x;
Tree -> update(i, x);
}
while (m --)
{
int op, a, b;
f >> op;
if (op == 0)
{
f >> a >> b;
Tree -> update(a, b);
}
else if (op == 1)
{
f >> a >> b;
g << Tree -> prefixSum(b) - Tree -> prefixSum(a - 1) << '\n';
}
else
{
assert(op == 2);
f >> a;
g << Tree -> query(a) << '\n';
}
}
}