Pagini recente » Cod sursa (job #3259767) | Cod sursa (job #2561149) | Cod sursa (job #737129) | Cod sursa (job #1564632) | Cod sursa (job #279033)
Cod sursa(job #279033)
#include <stdio.h>
int N, M, v[100005], arb[100005];
int LSB(int x)
{
return (x ^ (x - 1)) & x;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int i, j, op, x, y, s1, s2;
scanf("%d %d", &N, &M);
for (i = 1; i <= N; i++)
{
scanf("%d", &x);
j = i;
while (j <= N)
{
arb[j] += x;
j += LSB(j);
}
}
for (i = 1; i <= M; i++)
{
scanf("%d",&op);
if (op == 0)
{
scanf("%d %d", &x, &y);
j = x;
while (j <= N)
{
arb[j] += y;
j += LSB(j);
}
}
if (op == 1)
{
scanf("%d %d", &x, &y);
x--;
s1 = s2 = 0;
j = x;
while (j)
{
s1 += arb[j];
j -= LSB(j);
}
j = y;
while (j)
{
s2 += arb[j];
j -= LSB(j);
}
printf("%d\n", s2 - s1);
}
if (op == 2)
{
scanf("%d", &x);
int p, u, m, sol = -1;
p = 1; u = N;
while (p <= u)
{
m = (p + u) / 2;
j = m; s1 = 0;
while (j)
{
s1 += arb[j];
j -= LSB(j);
}
if (s1 == x)
{
sol = m; u = m - 1;
}
else if (s1 > x) u = m - 1;
else p = m + 1;
}
printf("%d\n", sol);
}
}
return 0;
}