Pagini recente » Cod sursa (job #2731322) | Cod sursa (job #2331097) | Cod sursa (job #2404565) | Cod sursa (job #428228) | Cod sursa (job #3303376)
#include <bits/stdc++.h>
using namespace std;
int lsb(int x)
{
return x & (-x);
}
struct AIB
{
vector<long long int> aib;
AIB(int n)
{
aib.resize(n + 9);
}
long long int query(int x)
{
if(x >= aib.size()) return 0;
long long int sum = 0;
for(int i = x; i > 0; i -= lsb(i))
sum += aib[i];
return sum;
}
void update(int x, int add)
{
for(int i = x; i < aib.size(); i += lsb(i))
aib[i] += add;
}
int cibin(long long int s)
{
int ans = 0;
long long int sum_ans = 0;
for(int pas = (1 << 18); pas > 0; pas /= 2)
{
if(ans + pas >= aib.size()) continue;
if((sum_ans + aib[ans + pas] < s))
{
ans += pas;
sum_ans += aib[ans];
}
}
if((query(ans + 1)) <= s)
ans++;
return ans;
}
};
vector<int> arr;
int main()
{
int n, q;
cin >> n >> q;
AIB aib(n);
arr.resize(n + 9);
for(int i = 1; i <= n; i++)
{
cin >> arr[i];
aib.update(i, arr[i]);
}
for(int i = 1; i <= q; i++)
{
int op;
cin >> op;
if(op == 0)
{
int poz;
long long int val;
cin >> poz >> val;
aib.update(poz, val);
arr[poz] += val;
}
else if(op == 1)
{
int l, r;
cin >> l >> r;
cout << aib.query(r) - aib.query(l - 1) << '\n';
}
else
{
int x;
cin >> x;
cout << aib.cibin(x) << '\n';
}
}
return 0;
}