Pagini recente » Cod sursa (job #3004222) | Cod sursa (job #2967623) | Cod sursa (job #599813) | Cod sursa (job #2622581) | Cod sursa (job #217644)
Cod sursa(job #217644)
#include <stdio.h>
const int N_MAX = 100010;
int N, M, aib[N_MAX], v[N_MAX];
int tata(int x)
{
return x + (x ^ (x & (x - 1)));
}
void constr()
{
for (int i = 1; i <= N; i ++) {
aib[i] += v[i];
aib[tata(i)] += aib[i];
}
}
void update(int poz, int val)
{
while (poz <= N) {
aib[poz] += val;
poz = tata(poz);
}
}
int query(int poz)
{
int sum = 0;
while (poz > 0) {
sum += aib[poz];
poz = poz & (poz - 1);
}
return sum;
}
int find(int a)
{
int i, step;
for (step = 1; step < N; step <<= 1);
for (i = 0; step; step >>= 1) {
if (i + step <= N && query(i + step) <= a) i += step;
}
if (query(i) == a) return i;
else return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
#ifndef _SCREEN_
freopen("aib.out", "w", stdout);
#endif
scanf("%d %d\n", &N, &M);
for (int i = 1; i <= N; i++) {
scanf("%d ", &v[i]);
}
constr();
int op, a, b;
for (int i = 1; i <= M; i ++) {
scanf("%d ", &op);
if (op == 0 || op == 1) {
scanf("%d %d\n", &a, &b);
if (op == 0) update(a, b);
else printf("%d\n", query(b) - query(a - 1));
} else {
scanf("%d\n", &a);
if (a == 0) printf("-1\n");
else printf("%d\n", find(a));
}
}
return 0;
}