Pagini recente » Cod sursa (job #3336867) | Cod sursa (job #112111) | Cod sursa (job #3312043) | Cod sursa (job #886399) | Cod sursa (job #3334334)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
vector<int>aib;
int putere;
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)
{
int ans = 0;
for (int p = 17; p >= 0; p--)
{
int idx = ans + (1 << p);
if (idx > n) continue;
if (aib[idx] <= a)
{
ans += 1 << p;
a -= aib[ans];
}
}
if (a == 0 && ans)
return ans;
return -1;
}
void citire_solve()
{
fin >> n >> q;
aib.resize(n + 1, 0);
for (int i = 0; (1 << i) <= n; i++)
putere = i;
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;
if (y > z)
swap(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;
}