Pagini recente » Cod sursa (job #557967) | Cod sursa (job #1560765) | Cod sursa (job #1646203) | Cod sursa (job #489154) | Cod sursa (job #1449377)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int MAX = 1e5 + 1;
int aib[MAX], n, m, q, a, b, p = 1;
int lsb(int x){//last significant bit
return x & (-x);
}
void update(int poz, int val){
for (int i = poz; i <= n; i += lsb(i))
aib[i] += val;
}
int sum (int poz){
int r = 0;
for (int i = poz; i >= 1; i -= lsb(i))
r += aib[i];
return r;
}
int mia (int x){
if (!x)
return -1;
int r = 0;
for (int pt = p; pt >= 1 && x; pt /= 2)
if (r + pt <= n && aib[r + pt] <= x){
x -= aib[r + pt];
r += pt;
}
if (x)
return -1;
else return r;
}
int main()
{
fin >> n >> m;
while (2 * p <= n)
p *= 2;
for (int val, i = 1; i <= n; i++){
fin >> val;
update(i, val);
}
for (; m; m--){
fin >> q;
if (q == 0){
fin >> a >> b;
update(a, b);
}else if (q == 1){
fin >> a >> b;
fout << sum(b) - sum (a - 1) << '\n';
}else{
fin >> a;
fout << mia(a) << '\n';
}
}
return 0;
}