Pagini recente » petreceri | Cod sursa (job #1761118) | Profil valentino | Cod sursa (job #421644) | Cod sursa (job #174959)
Cod sursa(job #174959)
#include <stdio.h>
unsigned int aib[100001];
unsigned int n, m, log;
void add(unsigned int, unsigned int);
unsigned int query(unsigned int);
unsigned int search(unsigned int);
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
unsigned int a, b, i, tip, res;
scanf("%u%u", &n, &m);
for(i = 1; i <= n; ++i)
{
scanf("%u", &a);
add(i, a);
}
i = 0;
while((1 << i) <= n)
{
++i;
}
log = i - 1;
for(i = 1; i <= m; ++i)
{
scanf("%u", &tip);
if(tip == 0)
{
scanf("%u %u", &a, &b);
add(a, b);
}
else if(tip == 1)
{
scanf("%u %u", &a, &b);
res = query(b) - query(a - 1);
printf("%u\n", res);
}
else
{
scanf("%u", &a);
res = search(a);
if(res == 0)
printf("-1\n");
else
printf("%u\n", res);
}
}
return 0;
}
void add(unsigned int pos, unsigned int val)
{
while(pos <= n)
{
aib[pos] += val;
pos += pos & (pos ^ (pos - 1));
}
}
unsigned int query(unsigned int pos)
{
unsigned int res = 0;
while(pos)
{
res += aib[pos];
pos -= pos & (pos ^ (pos - 1));
}
return res;
}
unsigned int search(unsigned int val)
{
unsigned int pos = 0, res = 0;
for(int i = log; i >= 0 && pos + (1 << i) <= n; --i)
{
if(aib[pos + (1 << i)] + res <= val)
{
pos += 1 << i;
res += aib[pos];
}
}
if(res == val)
{
return pos;
}
return 0;
}