Pagini recente » Cod sursa (job #2284017) | Cod sursa (job #2181533) | Cod sursa (job #2400717) | Cod sursa (job #1365485) | Cod sursa (job #286347)
Cod sursa(job #286347)
#include <stdio.h>
#define dim 100100
int n, m, aib[dim];
inline int lsb(int x)
{
return x&(-x);
}
void update(int i, int val)
{
for (; i<=n; i+=lsb(i))
aib[i]+=val;
}
int sum(int i)
{
int sum=0;
for (; i; i-=lsb(i))
sum+=aib[i];
return sum;
}
int query(int a, int b)
{
return sum(b)-sum(a-1);
}
int search(int val)
{
int i, poz;
for (poz=1; poz<=n; poz<<=1);
for (i=0; poz; poz>>=1)
if (i+poz<=n && val>=aib[i+poz])
{
i+=poz;
val-=aib[i];
if (!val) return i;
}
return -1;
}
int main()
{
int i, op, a, b;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (i=1; i<=n; i++)
{
scanf("%d ", &a);
update(i, a);
}
for (i=1; i<=m; i++)
{
scanf("%d ", &op);
if (op<2)
{
scanf("%d %d\n", &a, &b);
if (!op) update(a, b);
else printf("%d\n", query(a, b));
}
else
{
scanf("%d\n", &a);
printf("%d\n", search(a));
}
}
return 0;
}