Pagini recente » Cod sursa (job #1400699) | Cod sursa (job #3240220)
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100010], i, n, j, k, a, b;
void update(int poz, int val)
{
for (int i = poz; i <= n; i = i + (i & (-i)))
aib[i] += val;
}
int query(int poz)
{
int s = 0;
for (int i = poz; i >= 1; i = i - (i & (-i)))
s += aib[i];
return s;
}
int main()
{
in >> n >> k;
for (i = 1; i <= n; i++)
{
in >> a;
update(i, a);
}
for (i = 1; i <= k; i++)
{
in >> j >> a;
if (j == 2)
{
int p2 = 1 << (int)log2(n); ///ok? 2^(log2(n))
int poz = 0;
int s = 0;
for (; p2 >= 1; p2 = p2 / 2)
if (poz + p2 <= n && s + aib[poz + p2] < a)
{
s = s + aib[poz + p2];
poz = poz + p2;
}
if (poz == n || s + query(poz + 1) - query(poz) != a)
out << -1 << '\n';
else
out << poz + 1 << '\n';
continue;
}
in >> b;
if (j == 0)
update(a, b);
else if (j == 1)
out << query(b) - query(a - 1) << '\n';
}
}