Pagini recente » Cod sursa (job #3283824) | Sedinta 2009-03-16 | Cod sursa (job #1745882) | Cod sursa (job #2174746) | Cod sursa (job #173277)
Cod sursa(job #173277)
#include <stdio.h>
int N, M, A[100005];
void update(int x, int val)
{
for (; x <= N; x += x^(x-1)&x)
A[x] += val;
}
int query(int x)
{
int r;
for (r = 0; x; x -= x^(x-1)&x)
r += A[x];
return r;
}
int search(int x)
{
int log, p;
for (log = 1; log < N; log <<= 1);
for (p = 0; log; log >>= 1)
{
if (p + log > N) continue;
if (x >= A[p + log])
p += log, x -= A[p];
}
return (!x ? p : -1);
}
int main(void)
{
int i, v, tip, a, b;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &N, &M);
for (i = 1; i <= N; ++i)
{
scanf("%d", &v);
update(i, v);
}
for (; M; --M)
{
scanf("%d", &tip);
if (tip == 0)
{
scanf("%d %d", &a, &b);
update(a, b);
}
else if (tip == 1)
{
scanf("%d %d", &a, &b);
printf("%d\n", query(b) - query(a-1));
}
else if (tip == 2)
{
scanf("%d", &a);
printf("%d\n", (!a ? -1 : search(a)));
}
}
return 0;
}