Pagini recente » Cod sursa (job #1753188) | Cod sursa (job #335652) | Cod sursa (job #407938) | Cod sursa (job #1160183) | Cod sursa (job #419145)
Cod sursa(job #419145)
#include <stdio.h>
#define zeros(x) (x ^ (x - 1)) & x
#define NMAX 100001
long aib[NMAX], a, b, code, n, m;
void add(long a, long b)
{
for (long i = a; i <= n; i += zeros(i))
aib[i] += b;
}
long compute(long a)
{
long tmp = 0;
for (long i = a; i > 0; i -= zeros(i))
tmp += aib[i];
return tmp;
}
long bs(long val)
{
int i, step;
for (step = 1; step <= n; step <<= 1);
for (i = 0; step; step >>= 1)
if (i + step <= n && compute(i + step) <= val)
i += step;
return i;
}
long bin_search(long left, long right, long x)
{
long mid = (left + right) / 2, tmp = compute(mid);
if (tmp == x)
return mid;
if (left == right)
return -1;
if (tmp > x)
{
return bin_search(left, mid - 1, x);
}
return bin_search(mid + 1, right, x);
}
int main()
{
freopen ("aib.in", "rt", stdin);
freopen ("aib.out", "wt", stdout);
scanf("%ld %ld", &n, &m);
for (long i = 1; i <= n; ++i)
{
scanf("%ld", &a);
add(i, a);
}
for (long i = 0; i < m; ++i)
{
scanf("%ld %ld", &code, &a);
if (code != 2)
scanf("%ld", &b);
if (code == 0)
{
add(a, b);
}
else
if (code == 1)
{
printf("%ld\n", compute(b) - compute(a - 1));
}
else
if (code == 2)
{
printf("%ld\n", bs(a));
}
}
return 0;
}