Pagini recente » Cod sursa (job #2824437) | Cod sursa (job #169258) | Profil Olivia | Cod sursa (job #2450118) | Cod sursa (job #634515)
Cod sursa(job #634515)
#include <stdio.h>
#define NMAX 100010
int tree[NMAX];
int N;
int readFreq(int idx)
{
int sum = 0;
while (idx > 0) {
sum += tree[idx];
idx -= (idx & -idx);
}
return sum;
}
void update(int idx, int val)
{
while (idx <= N) {
tree[idx] += val;
idx += (idx & -idx);
}
}
int search(int val)
{
int i = 0;
int bitMask;
for (bitMask = 1; bitMask < N; bitMask<<=1);
for (i=0; bitMask; bitMask >>= 1) {
if (i + bitMask <= N) {
if (val >= tree[i+bitMask]) {
i += bitMask; val -= tree[i];
if (!val)
return i;
}
}
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int M, i, x, y, type;
scanf("%d %d", &N, &M);
for (i=1; i<=N; ++i) {
scanf("%d", &x);
update(i, x);
}
for (i=1; i<=M; ++i) {
scanf("%d", &type);
if (type == 0) {
scanf("%d %d", &x, &y);
update(x, y);
}
if (type == 1) {
scanf("%d %d", &x, &y);
printf("%d\n", readFreq(y) - readFreq(x-1));
}
if (type == 2) {
scanf("%d", &x);
printf("%d\n", search(x));
}
}
return 0;
}