Pagini recente » Cod sursa (job #682616) | Cod sursa (job #1709202) | Cod sursa (job #2327474) | Cod sursa (job #1195741) | Cod sursa (job #942961)
Cod sursa(job #942961)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
class Fenwick {
public:
Fenwick( int n ) :n(n) {
a.resize(n+1);
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
for (msb = 1; msb <= n; msb <<= 1);
msb >>= 1;
for (int stp = 2; stp <= n; stp<<=1)
for (int i = stp; i <= n; i += stp)
a[i] += a[i-stp/2];
}
inline void update( int lo, int val ) {
for (; lo <= n; lo += (lo & -lo))
a[lo] += val;
}
inline int getsum( int lo, int hi ) {
return getsum(hi)-getsum(lo-1);
}
inline int getsum( int hi ) {
int sum = 0;
for (; hi > 0; hi &= hi-1)
sum += a[hi];
return sum;
}
int idx_with_sum( int sum ) {
int idx = 0;
for (int stp = msb; stp > 0; stp >>= 1) {
idx += stp;
if (idx <= n && sum >= a[idx]) {
sum -= a[idx];
if (sum == 0) return idx;
}
else idx -= stp;
}
return -1;
}
vector<int> a;
int n;
int msb;
};
int main() {
int n, m;
fin >> n >> m;
Fenwick bit(n);
int op, lo, hi, val;
for (int i = 0; i < m; ++i) {
fin >> op;
if (op == 0) {
fin >> lo >> val;
bit.update(lo, val);
}
else if (op == 1) {
fin >> lo >> hi;
fout << bit.getsum(lo, hi) << '\n';
}
else if (op == 2) {
fin >> val;
fout << bit.idx_with_sum(val) << '\n';
}
}
return 0;
}