Pagini recente » Cod sursa (job #154787) | Cod sursa (job #3134733) | Cod sursa (job #1761131) | Cod sursa (job #136784) | Cod sursa (job #993885)
Cod sursa(job #993885)
#include <stdio.h>
#define NMax 100005
int n, m, s[NMax];
void update(int p, int add)
{
for (int pi = p; pi <= n; pi = pi + ((pi ^ (pi - 1)) & pi))
s[pi] += add;
}
int query(int p)
{
int r = 0;
for (int pi = p; pi > 0; pi = pi - ((pi ^ (pi - 1)) & pi))
r += s[pi];
return r;
}
int search(int val)
{
int p = 0, pi;
for (pi = 1; pi <= n; pi = pi << 1);
for (pi = pi >> 1; pi > 0; pi = pi >> 1)
{
if (p + pi <= n && s[p + pi] <= val)
{
val -= s[p + pi];
p += pi;
}
if (val == 0)
return p;
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int t, a, b;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a);
update(i, a);
}
while (m--)
{
scanf("%d %d", &t, &a);
if (t != 2)
scanf("%d", &b);
if (t == 0)
update(a, b);
else if (t == 1)
printf("%d\n", query(b) - query(a-1));
else
printf("%d\n", search(a));
}
return 0;
}