Pagini recente » Cod sursa (job #3306010) | Cod sursa (job #3354892) | Cod sursa (job #3349477) | Cod sursa (job #3345052) | Cod sursa (job #3311076)
#include <bits/stdc++.h>
std::ifstream fin("aib.in");
std::ofstream fout("aib.out");
const int NMAX = 1e5 + 5;
int n, q;
int fenwick[NMAX];
int LSB(int x) { return (x & (-x)); }
void update(int poz, int val)
{
for(int i = poz; i <= n; i += LSB(i))
fenwick[i] += val;
}
int query(int poz)
{
int ans = 0;
for(int i = poz; i >= 1; i -= LSB(i))
ans += fenwick[i];
return ans;
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
fin >> n >> q;
for(int i = 1; i <= n; ++i)
{
int x;
fin >> x;
update(i, x);
}
for(int k = 1; k <= q; ++k)
{
int task;
fin >> task;
if(task == 0)
{
int a, b;
fin >> a >> b;
update(a, b);
}
else if(task == 1)
{
int a, b;
fin >> a >> b;
fout << query(b) - query(a - 1) << "\n";
}
else if(task == 2)
{
int target;
fin >> target;
int sum = 0;
int poz = 0;
// Binary search on bits of the answer starting from MSB to LSB
// LSB(poz + 1 << bit) = bit => sum[1....(1 << bit)] = sum + fenwick[poz + 1 << bit], O(1)
for(int bit = 17; bit >= 0; --bit)
if(poz + (1 << bit) <= n && sum + fenwick[poz + (1 << bit)] < target)
{
sum += fenwick[poz + (1 << bit)];
poz += (1 << bit);
}
if(poz > n)
fout << -1 << "\n";
if(query(poz + 1) == target)
fout << poz + 1 << "\n";
else
fout << -1 << "\n";
}
}
return 0;
}