Pagini recente » Borderou de evaluare (job #2506692) | Cod sursa (job #2367555) | Cod sursa (job #856701) | Borderou de evaluare (job #1538831) | Cod sursa (job #632552)
Cod sursa(job #632552)
#include <stdio.h>
#define lsb(x) x & -x
int aib [100005], N, M;
void update (int x, int val)
{
while (x <= N)
{
aib[x] += val;
x += lsb(x);
}
}
int query (int x)
{
int r = 0;
while (x > 0)
{
r += aib[x];
x -= lsb(x);
}
return r;
}
int cauta (int val)
{
int p = 1, u = N, m, s;
while (p <= u)
{
m = (p+u) >> 1;
s = query (m);
if (s == val)
return m;
if (s < val)
p = m + 1;
else
u = m - 1;
}
return -1;
}
void parc ()
{
scanf ("%d%d", &N, &M);
for (int i = 1, x; i <= N; i++)
{
scanf ("%d", &x);
update (i, x);
}
for (int i = 1, t, a, b; i <= M; i++)
{
scanf ("%d%d", &t, &a);
if (t == 2)
{
printf ("%d\n", cauta (a));
}
else
{
scanf ("%d", &b);
if (t)
printf ("%d\n", query (b) - query (a-1));
else
update (a, b);
}
}
}
int main ()
{
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
parc ();
return 0;
}