Pagini recente » Cod sursa (job #1674225) | Cod sursa (job #304306) | Cod sursa (job #2330409) | Cod sursa (job #2530746) | Cod sursa (job #2396281)
#include <cstdio>
#define NMAX 100005
#define zero(x) x&(-x)
using namespace std;
int n, m;
int arr[NMAX], arb[NMAX];
void adaugare(int el, int poz) {
for (int i = poz; i <= n; i += zero(i)) {
arb[i] += el;
}
}
int suma(int poz) {
int s = 0;
for (int i = poz; i > 0; i -= zero(i))
s += arb[i];
return s;
}
int suma_primelor(int x) {
int lg = 1, i;
for (lg; lg <= n; lg <<= 1);
for (i = 1; lg != 0; lg >>= 1) {
if (i + lg <= n && suma(i+lg) <= x)
i += lg;
}
if (suma(i) != x)
return -1;
return i;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d ", &arr[i]);
adaugare(arr[i], i);
}
scanf("\n");
for (int x = 1; x <= m; ++x) {
int cod, a, b;
scanf("%d ", &cod);
if (cod == 0) {
scanf("%d %d\n", &a, &b);
arr[a] += b;
adaugare(b, a);
}
else if (cod == 1) {
scanf("%d %d\n", &a, &b);
printf("%d\n", suma(b) - suma(a-1));
}
else {
scanf("%d\n", &a);
printf("%d\n", suma_primelor(a));
}
}
return 0;
}