Pagini recente » Cod sursa (job #1480448) | Cod sursa (job #3271353) | Cod sursa (job #1305745) | Cod sursa (job #2204172) | Cod sursa (job #3320312)
#include <iostream>
#include <fstream>
#include <vector>
#define int long long
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
vector<int>aib;
int n;
int lsb(int val) {
return val & (-val);
}
int query(int x) {
int sum = 0;
for (int i = x; i >= 1; i -= lsb(i)) {
sum += aib[i];
}
return sum;
}
void update(int x, int val) {
for (int i = x; i <= n; i += lsb(i)) {
aib[i] += val;
}
}
int cb(int val) {
int pow2 = 2 << 17;
int pozi = 0;
int crt = 0;
for (int i = pow2; i > 0; i /= 2) {
if (pozi + i <= n && crt+aib[i]<=val) {
pozi += i;
crt += aib[i];
}
}
return pozi;
}
vector<int>v;
int_fast32_t main()
{
int teste;
fin >> n >> teste;
v.resize(n + 1);
aib.resize(n * n + 2);
for (int i = 1; i <= n; ++i) {
fin >> v[i];
update(i, v[i]);
}
for (int i = 0; i < teste; ++i) {
int cer = 0;
fin >> cer;
if (cer == 0) {
int x, val;
fin >> x >> val;
update(x, val);
}
else if (cer == 1) {
int st, dr;
fin >> st >> dr;
if (st != 0) {
fout << query(dr) - query(st - 1) << endl;
}
else {
fout << query(dr) << endl;
}
}
else if (cer == 2) {
int x;
fin >> x;
fout << cb(x) << endl;
}
}
return 0;
}