Cod sursa(job #779618)
#include <fstream>
using namespace std;
#define point(i) ((i & (i - 1)) ^ i)
int N, M, A, B;
int aib[100005];
void Update (int i, int A) {
while (i <= N)
{
aib[i] += A;
i += point (i);
}
}
int Query (int A, int B) {
int cnt = 0;
while (B >= 1)
{
cnt += aib[B];
B -= point (B);
}
A--;
while (A >= 1)
{
cnt -= aib[A];
A -= point (A);
}
return cnt;
}
int Search (int val) {
int i = 0, step = 1 << 17;
for (; step; step >>= 1)
{
if (i + step <= N && aib[i + step] <= val)
{
val -= aib[i + step];
i += step;
}
}
if (!val) return i;
return -1;
}
int main () {
ifstream fin ("aib.in");
ofstream fout ("aib.out");
fin >> N >> M;
for (int i = 1; i <= N; i++)
{
fin >> A;
Update (i, A);
}
int lol;
for (int i = 0; i < M; i++)
{
fin >> lol;
if (!lol)
{
fin >> A >> B;
Update (A, B);
}
else if (lol == 1)
{
fin >> A >> B;
fout << Query (A, B) << "\n";
}
else
{
fin >> A;
fout << Search (A) << "\n";
}
}
fout.close ();
return 0;
}