Pagini recente » Borderou de evaluare (job #3345271) | Cod sursa (job #3340359) | Cod sursa (job #3334280)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
vector<int>aib;
int n, q;
int x, y, z;
int lsb(int x)
{
return (x & (-x));
}
int query(int idx) {
int sum = 0;
// Mergem descrescator scazand LSB
for (; idx > 0; idx -= (idx & -idx)) {
sum += aib[idx];
}
return sum;
}
void update(int idx, int val) {
// Mergem crescator adaugand LSB
for (; idx <= n; idx += (idx & -idx)) {
aib[idx] += val;
}
}
int c2(int a)
{
for (int i = 0; (1<<i)<= n; i++)
if (aib[(1 << i)] == a)
return (1<<i);
}
void citire_solve()
{
fin >> n >> q;
aib.resize(n + 1, 0);
for (int i = 1; i <= n; i++)
{
fin >> x;
update(i, x);
}
for (int i = 1; i <= q; i++)
{
fin >> x;
if (x == 0)
{
fin >> y >> z;
update(y, z);
}
else if (x == 1)
{
fin >> y >> z;
fout << query(z) - query(y - 1)<<'\n';
}
else if (x == 2)
{
fin >> y;
fout << c2(y)<<'\n';
}
}
}
int main()
{
citire_solve();
return 0;
}