Pagini recente » Cod sursa (job #230) | Cod sursa (job #783161) | Cod sursa (job #391972) | Cod sursa (job #2702739) | Cod sursa (job #2939083)
#pragma warning(disable : 4996);
#include <stdio.h>
using namespace std;
FILE *cin, *cout;
const int nmax = 1e5;
int n, m, aib[nmax + 1];
int read_cum(int index) {
int sum = 0;
while (index > 0) {
sum += aib[index];
index -= (index & -index);
}
return sum;
}
void update(int index, int val) {
while (index <= n) {
aib[index] += val;
index += (index & -index);
}
}
int read(int index) {
int sum = aib[index];
if (index > 0) {
int lca = index - (index & -index);
index--;
while (index != lca) {
sum -= aib[index];
index -= (index & -index);
}
}
return sum;
}
int find_smallest(int cum) {
int index = 0, bitmask = 1, ans = -1;
while (bitmask <= n)
bitmask <<= 1;
bitmask >>= 1;
while (bitmask != 0) {
int mid = index + bitmask;
bitmask >>= 1;
if (mid > n)
continue;
if (aib[mid] == cum)
ans = mid;
if (aib[mid] < cum) {
index = mid;
cum -= aib[mid];
}
}
return ans;
}
int main() {
cin = fopen("aib.in", "r");
cout = fopen("aib.out", "w");
fscanf(cin, "%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
int x;
fscanf(cin, "%d", &x);
update(i, x);
}
for (int i = 1; i <= m; i++) {
int q;
fscanf(cin, "%d", &q);
if (q == 0) {
int x, y;
fscanf(cin, "%d %d", &x, &y);
update(x, y);
}
else if (q == 1) {
int x, y;
fscanf(cin, "%d %d", &x, &y);
fprintf(cout, "%d\n", read_cum(y) - read_cum(x - 1));
}
else {
int x;
fscanf(cin, "%d", &x);
fprintf(cout, "%d\n", find_smallest(x));
}
}
}