Pagini recente » Cod sursa (job #2513824) | Cod sursa (job #55621) | Cod sursa (job #814080) | Cod sursa (job #16792) | Cod sursa (job #898803)
Cod sursa(job #898803)
#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 = x;
for (; cnt > 0; cnt >>= 1)
if (i + cnt <= N)
if (sum - aib[i + cnt] >= 0)
i += cnt, sum -= aib[i];
if (sum == 0)
fout << i << '\n';
else
fout << "-1\n";
}
}
fout.close();
return 0;
}