Pagini recente » Cod sursa (job #2082178) | Cod sursa (job #1106636) | Cod sursa (job #1278519) | Cod sursa (job #3171175) | Cod sursa (job #2221834)
#include <cstdio>
int length, BIT[100001];
__attribute__((always_inline)) void Update(int position, int value)
{
for(int index = position; index <= length; index += index & -index)
{
BIT[index] += value;
}
}
__attribute__((always_inline)) int Querry(int position)
{
int sum = 0;
for(int index = position; index; index -= index & -index)
{
sum += BIT[index];
}
return sum;
}
__attribute__((always_inline)) int Search(int sum)
{
int i, step;
for(step = 1; step <= length; step <<= 1);
for(i = 0; step; step >>= 1)
{
if(i + step <= length && sum >= BIT[i + step])
{
i += step;
sum -= BIT[i];
if(!sum) return i;
}
}
return -1;
}
int main(){
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int operations, task, x, y;
scanf("%d %d", &length, &operations);
for(int i = 1; i <= length; i++)
{
scanf("%d", &x);
Update(i, x);
}
while(operations--)
{
scanf("%d", &task);
switch(task)
{
case 0: scanf("%d %d", &x, &y);
Update(x, y);
break;
case 1: scanf("%d %d", &x, &y);
printf("%d\n", Querry(y) - Querry(x - 1));
break;
case 2: scanf("%d", &x);
printf("%d\n", Search(x));
}
}
return 0;
}