Pagini recente » Cod sursa (job #691846) | Cod sursa (job #1696302) | Cod sursa (job #1186232) | Cod sursa (job #2592056) | Cod sursa (job #181830)
Cod sursa(job #181830)
#include <stdio.h>
#define INPUT "aib.in"
#define OUTPUT "aib.out"
#define NMAX 100001
int tree[NMAX];
int N, M;
int search(int val)
{
int i, step;
for(step = 1; step <= N; step <<= 1) ;
for(i = 0; step; step >>= 1)
if(i + step <= N && tree[i+step] <= val)
{
val -= tree[i + step];
i += step;
if(!val) return i;
}
return -1;
}
int query(int idx)
{
int sum = 0;
while(idx)
sum += tree[idx],
idx -= idx&-idx;
return sum;
}
void update(int idx, int val)
{
while(idx <= N)
tree[idx] += val,
idx += idx&(-idx);
}
void citire()
{
scanf("%d %d", &N, &M);
int i;
for(i = 1; i <= N; ++i)
{
int val;
scanf("%d", &val);
update(i, val);
}
}
int main()
{
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
citire();
int i;
for(i = 1; i <= M; ++i)
{
int tip, a, b;
scanf("%d", &tip);
if(tip == 0)
{
scanf("%d %d", &a, &b);
update(a, b);
}
else if(tip == 1)
{
scanf("%d %d", &a, &b);
printf("%d\n", query(b) - query(a-1));
}
else if(tip == 2)
{
scanf("%d", &a);
printf("%d\n", search(a));
}
}
return 0;
}