Pagini recente » Cod sursa (job #1908567) | Cod sursa (job #2410925) | Cod sursa (job #3301339) | Cod sursa (job #2585825) | Cod sursa (job #2885275)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
void update(int n, vector<int> &aib, int pos, int increment)
{
while (pos <= n) {
aib[pos] += increment;
pos += (pos & -pos);
}
}
int query(const vector<int> &aib, int pos)
{
int s = 0;
while (pos != 0) {
s += aib[pos];
pos -= (pos & -pos);
// pos &= (pos - 1);
}
return s;
}
int query2(int n, const vector<int> &aib, int a)
{
int bitmask = 1;
while (bitmask <= n)
bitmask <<= 1;
bitmask >>= 1;
int rest = a;
int ind = 0;
int goodInd = -1;
while (bitmask != 0) {
if (ind + bitmask > n) {
bitmask >>= 1;
}
else if (aib[ind + bitmask] > rest) {
bitmask >>= 1;
}
else if (aib[ind + bitmask] == rest) {
goodInd = ind + bitmask;
bitmask >>= 1;
}
else {
rest -= aib[ind];
ind += bitmask;
bitmask >>= 1;
}
}
return goodInd;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
fin >> n >> m;
vector<int> aib(n+1, 0);
for (int i = 1; i <= n; ++i) {
int x;
fin >> x;
update(n, aib, i, x);
}
for (int i = 0; i < m; ++i) {
int op;
fin >> op;
if (op == 0) {
int a, b;
fin >> a >> b;
update(n, aib, a, b);
}
else if (op == 1) {
int a, b;
fin >> a >> b;
if (a == 1)
fout << query(aib, b) << "\n";
else {
fout << query(aib, b) - query(aib, a-1) << "\n";
}
}
else {
int a;
fin >> a;
fout << query2(n, aib, a) << "\n";
}
}
return 0;
}