Pagini recente » Cod sursa (job #930499) | Cod sursa (job #2475735) | Cod sursa (job #1705247) | Cod sursa (job #1109839) | Cod sursa (job #898765)
Cod sursa(job #898765)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N, M, A[100100];
int aib[100100];
inline void update(int poz, int val)
{
for (int i = poz; i <= N; i = (i | (i - 1)) + 1) aib[i] += val;
}
inline int query(int poz)
{
int ret = 0;
for (int i = poz; i >= 1; i = i & (i - 1)) ret = ret + aib[i];
return ret;
}
int main()
{
fin >> N >> M;
for (int i = 1; i <= N; i++)
{
fin >> A[i];
update(i, A[i]);
}
for (; M--; )
{
int q;
fin >> q;
if (q == 0)
{
int x, y;
fin >> x >> y;
update(x, y);
}
else
if (q == 1)
{
int x, y;
fin >> x >> y;
fout << query(y) - query(x - 1) << '\n';
}
else
{
int x;
fin >> x;
int i = 0, cnt = 1 << 20, sum = 0;
for (; cnt > 0; cnt >>= 1)
if (i + cnt <= N)
if (sum + aib[i + cnt] <= x)
i += cnt, sum += aib[i];
if (sum == x)
fout << i << '\n';
else
fout << "-1\n";
}
}
fout.close();
return 0;
}