Pagini recente » Cod sursa (job #1768050) | Cod sursa (job #1762335) | Cod sursa (job #2061625) | Cod sursa (job #2228432) | Cod sursa (job #1029136)
#include <cstdio>
#define FILEIN "aib.in"
#define FILEOUT "aib.out"
#define NMAX 100005
int N;
int tree[NMAX];
void update_tree(int pos, int value)
{
while ( pos <= N )
{
tree[pos] += value;
pos += (pos & -pos);
}
}
int sum_tree(int pos)
{
int sum = 0;
while ( pos )
{
sum += tree[pos];
pos -= (pos & -pos);
}
return sum;
}
int find_sum_tree(int sum)
{
int pos = 1, i = 0;
while ( pos <= N )
pos += (pos & -pos);
while ( pos )
{
if ( i + pos <= N && tree[pos+i] <= sum )
{
sum -= tree[pos+i];
i += pos;
if ( sum == 0 ) return i;
}
pos /= 2;
}
return -1;
}
int main()
{
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
int M, i;
scanf("%d %d", &N, &M);
for ( i = 1; i <= N; i++)
{
int x; scanf("%d", &x);
update_tree(i, x);
}
for ( i = 1; i <= M; i++)
{
int t, x, y;
scanf("%d", &t);
if ( t == 2 )
{
scanf("%d", &x);
printf("%d\n", find_sum_tree(x));
}
else
if ( t == 1 )
{
scanf("%d %d", &x, &y);
printf("%d\n", sum_tree(y) - sum_tree(x-1));
}
else
if ( t == 0 )
{
scanf("%d %d", &x, &y);
update_tree(x, y);
}
}
return 0;
}