Pagini recente » Cod sursa (job #1619408) | Cod sursa (job #1605472) | Cod sursa (job #1304411) | Cod sursa (job #1564501) | Cod sursa (job #2792748)
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int a[NMAX];
int n, m, x, y, opt;
// returns least significant bit of a number
inline int LBT(int x) {
return x & -x;
}
int prefixSum(int i){
int sum = 0;
while (i) {
sum += a[i];
i = i - LBT(i);
}
return sum;
}
int sumQuery(int i, int j) {
return prefixSum(j) - prefixSum(i - 1);
}
void add(int i, int x) {
while (i <= n) {
a[i] += x;
i += LBT(i);
}
}
int binarySearchPrefix(int x, int st, int dr) {
int mij;
while (dr - st > 1) {
mij = st + (dr - st) / 2;
if (prefixSum(mij) > x) dr = mij;
else st = mij;
}
return prefixSum(st) == x ? st : -1;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
fin >> x;
add(i, x);
}
while (m--) {
fin >> opt;
switch (opt)
{
case 0: {
fin >> x >> y;
add(x, y);
break;
}
case 1: {
fin >> x >> y;
fout << sumQuery(x, y) << '\n';
break;
}
case 2: {
fin >> x;
fout << binarySearchPrefix(x, 1, n + 1) << '\n';
}
}
}
fin.close();
fout.close();
return 0;
}