Pagini recente » Cod sursa (job #986208) | Cod sursa (job #3269610) | Cod sursa (job #3233495) | Cod sursa (job #2226662) | Cod sursa (job #2042432)
#include <iostream>
#include <cstdio>
#define N 100005
using namespace std;
int vec[N], n, m;
void update(int init_poz, int x)
{
for(int i = init_poz ; i <= n ; )
{
vec[i] += x;
i += ((i ^ (i - 1)) & i);
}
}
int sum_poz(int poz)
{
int sum = 0;
for(int i = poz ; i > 0 ; )
{
sum += vec[i];
i -= ((i ^ (i - 1)) & i);
}
return sum;
}
int binary__search(int total_sum)
{
int left = 1 , right = n, midle, tmp_sum = -1;
while(left != right)
{
midle = ( left + right ) >> 1;
tmp_sum = sum_poz(midle);
if(tmp_sum >= total_sum)
{
right = midle;
continue;
}
if(tmp_sum < total_sum)
{
left = midle + 1;
continue;
}
}
return left;
}
void solve()
{
int caz, a, b;
for(int i = 1 ; i <= m ; ++i)
{
scanf("%d ", &caz);
if(caz == 2)
{
scanf("%d\n", &a);
printf("%d\n", binary__search(a));
}
else
{
scanf("%d %d\n", &a, &b);
if(caz == 0)
{
update(a,b);
}
else
{
printf("%d\n", sum_poz(b) - sum_poz(a - 1));
}
}
}
}
void read()
{
scanf("%d %d\n", &n, &m);
int x;
for(int i = 1 ; i <= n ; ++i)
{
scanf("%d ", &x);
update(i,x);
}
solve();
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
read();
return 0;
}