Pagini recente » Cod sursa (job #1494802) | Cod sursa (job #2605086) | Cod sursa (job #1959681) | Cod sursa (job #2518385) | Cod sursa (job #3160298)
#include <fstream>
using namespace std;
int n, m;
int AIB[100001];
void update(int poz, int val) {
for (int i = poz; i <= n; i += (i & -i)) {
AIB[i] += val;
}
}
int query(int poz) {
int sum = 0;
for (int i = poz; i > 0; i -= (i & -i)) {
sum += AIB[i];
}
return sum;
}
int findSum(int sum) {
int st = 1;
int dr = n;
while (st <= dr) {
int mid = (st + dr) / 2;
int midSum = query(mid);
if (midSum == sum)
return mid;
if (midSum < sum)
st = mid + 1;
else if (midSum > sum)
dr = mid - 1;
}
return -1;
}
int main()
{
FILE *inFile, *outFile;
inFile = fopen("aib.in", "r");
outFile = fopen("aib.out", "w");
fscanf(inFile, "%i %i", &n, &m);
for (int i = 1; i <= n; i++) {
int x;
fscanf(inFile, "%i", &x);
update(i, x);
}
for (int i = 1; i <= m; i++) {
int op, a, b;
fscanf(inFile, "%i", &op);
if (op == 0) {
fscanf(inFile, "%i %i", &a, &b);
update(a, b);
}
if (op == 1) {
fscanf(inFile, "%i %i", &a, &b);
fprintf(outFile, "%i %c", query(b) - query(a - 1), '\n');
}
if (op == 2) {
fscanf(inFile, "%i", &a);
fprintf(outFile, "%i %c", findSum(a), '\n');
}
}
}