Pagini recente » Cod sursa (job #2332953) | Cod sursa (job #73479) | Cod sursa (job #2186337) | Cod sursa (job #2843877) | Cod sursa (job #1519289)
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
long long aib[100010];
inline void add (int poz, int x)
{
for (int i = poz; i <= n; i += i & (-i))
aib[i] += 1LL * x;
}
inline long long querry (int poz)
{
long long rez = 0LL;
for (int i = poz; i; i -= i & (-i))
rez += aib[i];
return rez;
}
inline int cb (int x)
{
int a = 1, b = n, mi = -1;
while (a <= b)
{
int mid = (a + b) >> 1;
long long sum = querry (mid);
if (sum == 1LL * x)
{
mi = mid;
b = mid - 1;
}
else if (sum > 1LL * x) b = mid - 1;
else a = mid + 1;
}
return mi;
}
int main ()
{
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int m;
scanf ("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
int x;
scanf ("%d", &x);
add (i, x);
}
for (int i = 1; i <= m; ++i)
{
int op, a;
scanf ("%d %d", &op, &a);
if (!op)
{
int b;
scanf ("%d", &b);
add (a, b);
}
else if (op == 1)
{
int b;
scanf ("%d", &b);
printf ("%d\n", querry (b) - querry (a - 1));
}
else
printf ("%d\n", cb (a));
}
return 0;
}