Pagini recente » Cod sursa (job #982651) | Cod sursa (job #677529) | Cod sursa (job #1035538) | Cod sursa (job #2197722) | Cod sursa (job #3177953)
#include <fstream>
#include <vector>
using namespace std;
struct _AIB
{
vector<int> bit;
_AIB (int newsize) {
bit.resize (newsize + 1);
}
_AIB ();
void update (int i, int val) {
while (i < bit.size()) {
bit[i] += val;
i += (i & -i);
}
}
int range (int i, int j) {
return prefixsum (j) - prefixsum (i - 1);
}
int prefixsum (int i) {
int sum = 0;
while (i > 0) {
sum += bit[i];
i -= (i & -i);
}
return sum;
}
};
int main()
{
ifstream cin ("aib.in");
ofstream cout ("aib.out");
//ios_base::sync_with_stdio(false);
//cin.tie(NULL);
//cout.tie(NULL);
int n, q; cin >> n >> q;
_AIB aib(n);
for (int i = 1; i <= n; i ++)
{
int a; cin >> a;
aib.update(i, a);
}
for (int i = 1; i <= q; i ++)
{
int nr; cin >> nr;
int s;
int a, b, lo = 0, hi = n + 1;
bool ok = 0;
switch (nr)
{
case 0:
cin >> a >> b;
aib.update(a, b);
break;
case 1:
cin >> a >> b;
cout << aib.range(a, b) << '\n';
break;
case 2:
cin >> s;
lo = 0;
hi = n + 1;
while (lo + 1 < hi)
{
int mid = (lo + hi) / 2, val = aib.prefixsum(mid);
if (val == s)
{
cout << mid << '\n';
ok = 1;
break;
}
else if (val > s)
{
hi = mid;
}
else
{
lo = mid;
}
}
if (!ok) cout << -1 << '\n';
break;
default:
break;
}
}
}
/**
6
72 54 25 64 87 15
*/