Pagini recente » Cod sursa (job #275608) | Cod sursa (job #410385) | Cod sursa (job #259032) | Cod sursa (job #95606) | Cod sursa (job #185096)
Cod sursa(job #185096)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#define N 100352
int a[N], n;
void update(int p, int v)
{
int k;
while (p <= n)
{
a[p] += v;
k = 0;
while (!(p & (1 << k))) k++;
p += 1 << k;
}
}
int query(int p)
{
int k, s = 0;
while (p)
{
s += a[p];
k = 0;
while (!(p & (1 << k))) k++;
p -= 1 << k;
}
return s;
}
int search(int v)
{
int i, t, step = 1;
while (step <= n) step <<= 1;
for (i = 0; step; step >>= 1)
if (i + step <= n)
{
t = query(i + step);
if (t == v)
return i + step;
if (t < v)
i += step;
}
return -1;
}
int main()
{
freopen("aib.in", "rt", stdin);
freopen("aib.out", "wt", stdout);
int m;
scanf("%d%d", &n, &m);
for (int v, i = 1; i <= n; i++)
{
scanf("%d", &v);
update(i, v);
}
for (int t, i = 0; i < m; i++)
{
scanf("%d", &t);
if (t == 0)
{
int x, y;
scanf("%d%d", &x, &y);
update(x, y);
}
else if (t == 1)
{
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", query(y) - query(x - 1));
}
else
{
int x;
scanf("%d", &x);
printf("%d\n", search(x));
}
}
return 0;
}