Pagini recente » Cod sursa (job #330964) | Cod sursa (job #1009198) | Cod sursa (job #138233) | Cod sursa (job #1257250) | Cod sursa (job #1413732)
#include <string>
#include <stdio.h>
#include <iostream>
#include <ctime>
using namespace std;
int main() {
int i, *AIB, min, m, n, op, num, sum, dif, cp, search, right = 1, max = 1, left, certain, step, j, val;
cin >> m >> n;
int t1, t2;
t1 = time(0);
bool *v = new bool[m];
for(cp = m; cp >>= 1; max <<= 1);
max <<= 1;
AIB = new int[max + 1];
for(int iteratii = 0; iteratii < m; iteratii++) {
cin >> val;
for (int i = iteratii + 1; i <= max; i += (i & (-i))) {
AIB[i] += val;
}
}
for(int iteratii = 0; iteratii < n; iteratii++) {
cin >> op;
switch(op) {
case 0:
cin >> num >> val;
for (int i = num; i <= max; i += (i & (-i))) {
AIB[i] += val;
}
break;
case 1:
cin >> left >> right;
// cout << left << " " << right << endl;
left--;
right;
sum = 0;
while(left != right) {
if(right > left) {
sum += AIB[right];
right -= (right & (-right));
}
else {
sum -= AIB[left];
left -= (left & (-left));
}
}
cout << sum << endl;
break;
case 2:
cin >> search;
step = max >> 1, certain = 0;
for(j = 0; step; step >>= 1) {
if(AIB[j + step] <= search) {
if(AIB[j + step] == search) {
certain = j + step;
continue;
}
search -= AIB[j + step], j += step;
}
}
cout << certain << endl;
break;
}
}
delete[] AIB;
delete[] v;
return 0;
}