Pagini recente » Cod sursa (job #29789) | Cod sursa (job #1052752) | Cod sursa (job #2750766) | Cod sursa (job #2902131) | Cod sursa (job #1419575)
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
int *AIB, m, n, op, num, cp, search, max = 1, certain, step, j, sumA, sumB, a, b;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &m, &n);
for(cp = m; cp >>= 1; max <<= 1);
max <<= 1;
AIB = new int[max + 1];
for(int iteratii = 0; iteratii < m; ++iteratii) {
scanf("%d", &num);
for (int i = iteratii + 1; i <= max; i += (i & (-i))) {
AIB[i] += num;
}
}
for(int iteratii = 0; iteratii < n; ++iteratii) {
scanf("%d", &op);
switch(op) {
case 0:
scanf("%d%d", &a, &b);
for (int i = a; i <= max; i += (i & (-i))) {
AIB[i] += b;
}
break;
case 1:
scanf("%d%d", &a, &b);
sumA = 0;
sumB = 0;
for(int i = a - 1; i > 0; i -= (i & (-i)))
sumA += AIB[i];
for(int i = b; i > 0; i -= (i & (-i)))
sumB += AIB[i];
printf("%d\n", sumB - sumA);
break;
case 2:
scanf("%d", &a);
search = a;
step = max, certain = -1;
for(j = 0; step; step >>= 1) {
if(j + step < max && AIB[j + step] <= search) {
if(AIB[j + step] == search) {
certain = j + step;
continue;
}
search -= AIB[j + step], j += step;
}
}
printf("%d\n", certain);
break;
}
}
// for(int i = 1; i <= m; ++i)
// printf("%d ", AIB[i]);
// cout << '\n';
delete[] AIB;
return 0;
}