Pagini recente » Cod sursa (job #2216562) | Cod sursa (job #2240246) | Cod sursa (job #2391648) | Cod sursa (job #1996117) | Cod sursa (job #2221824)
#include <cstdio>
#define uint32_t int
#define BUFFER_SIZE 1 << 18
char inBuffer[BUFFER_SIZE];
uint32_t index = BUFFER_SIZE, BIT[100001], N;
__attribute__((always_inline)) char get_char()
{
if(index == BUFFER_SIZE)
{
fread(inBuffer, 1, BUFFER_SIZE, stdin);
index = 0;
}
return inBuffer[index++];
}
__attribute__((always_inline)) uint32_t get_uint32_t()
{
char c = get_char(); uint32_t number = 0;
for(; c < 48 || c > 57; c = get_char());
for(; c > 47 && c < 58; c = get_char())
number = number * 10 + c - '0';
return number;
}
__attribute__((always_inline)) void Update(int position, int value)
{
for(int index = position; index <= N; index += index & -index)
{
BIT[index] += value;
}
}
__attribute__((always_inline)) uint32_t Querry(uint32_t position)
{
uint32_t sum = 0;
for(uint32_t index = position; index; index -= index & -index)
{
sum += BIT[index];
}
return sum;
}
__attribute__((always_inline)) uint32_t Search(uint32_t value)
{
uint32_t i, step;
for(step = 1; step < N; step <<= 1);
for(i = 0; step; step >>= 1)
{
if(i + step <= N && value >= BIT[i + step])
{
i += step;
value -= BIT[i];
if(!value) return i;
}
}
return -1;
}
uint32_t main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
uint32_t operations = get_uint32_t(), task, x, y;
N = get_uint32_t();
for(uint32_t i = 1; i <= N; ++i)
{
x = get_uint32_t();
Update(i, x);
}
while(operations--)
{
task = get_uint32_t();
switch(task)
{
case 0: x = get_uint32_t();
y = get_uint32_t();
Update(x, y);
break;
case 1: x = get_uint32_t();
y = get_uint32_t();
printf("%d\n", Querry(y) - Querry(x - 1));
break;
case 2: x = get_uint32_t();
printf("%d\n", Search(x));
}
}
return 0;
}