Pagini recente » Cod sursa (job #2718765) | Cod sursa (job #2432602) | Cod sursa (job #2276342) | Cod sursa (job #2113094) | Cod sursa (job #2243955)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[132000];
int n, m, x, q, a, b;
void apdate(int pos, int val) {
while (pos <= n) {
aib[pos] += val;
pos += pos & (-pos);
}
}
int intSum(int pos) {
if (pos == 0) return 0;
return aib[pos] + intSum(pos - (pos & (-pos)));
}
int findPos(int sum) {
int pos = 1;
int prev = 1;
int s = 0;
while (s < sum) {
if (s + aib[pos] < sum && pos <= n) {
prev = pos;
pos += pos & (-pos);
}
else if (s + aib[pos] == sum) {
return pos;
}
else {
s += aib[prev];
pos = prev + 1;
}
}
return -1;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> x;
apdate(i, x);
}
for (int i = 1; i <= m; i++) {
fin >> q;
switch (q) {
case 0: {
fin >> a >> b;
apdate(a, b);
} break;
case 1: {
fin >> a >> b;
fout << intSum(b) - intSum(a - 1) << '\n';
} break;
case 2: {
fin >> a;
fout << findPos(a) << '\n';
}
}
}
return 0;
}