Pagini recente » Cod sursa (job #2740540) | Cod sursa (job #2110345) | Cod sursa (job #2063751) | Istoria paginii runda/avram2013_1/clasament | Cod sursa (job #2206031)
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class BIT {
public:
vector<int> arr;
BIT(int n) {
arr.resize(n+1, 0); // we start at index 1 .. n
}
BIT (vector<int> arr_) {
arr.resize(arr_.size()+1,0);
for (int i=0; i<arr_.size(); i++) {
arr[i+1] = arr_[i];
}
}
void update (int i, int delta) {
while (i < arr.size()) {
arr[i] += delta;
i += (i & -i);
}
}
// computes prefix sum at [1 .. i]
int prefix_sum (int i) {
int sum = 0;
while (i > 0) {
sum += arr[i];
i -= (i & -i);
}
return sum;
}
// computes range sum at [i .. j]
int range_sum (int i, int j) {
//int pj = prefix_sum(j);
//int pi = prefix_sum(i-1);
return prefix_sum(j) - prefix_sum(i-1);
}
/*friend ostream& operator <<(ostream& out, BIT& rhs) {
for (int i=1; i<rhs.arr.size(); ++i) {
out << rhs.arr[i] << " ";
return out;
}*/
};
int op2 (BIT& bit, int a) {
int l = 1;
int r = bit.arr.size()-1;
while (l <= r) {
int m = l + ((r-l) >> 1);
int s = bit.prefix_sum(m);
//cout << l << ", " << m << "," << r << ": s= " << s << endl;
if (s == a) {
return m;
}
else if (s < a) {
l = m+1;
}
else {
r = m-1;
}
}
return -1;
}
int main () {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int n,m;
cin >> n >> m;
BIT bit(n);
for (int i=0; i<n; ++i) {
int val;
cin >> val;
bit.update(i+1, val);
}
for (int i=0; i<m; ++i) {
int c, a, b;
cin >> c;
if (c == 0) {
cin >> a >> b;
bit.update(a,b);
//cout << "bit: " << bit << endl;
}
else if (c == 1) {
cin >> a >> b;
int s = bit.range_sum(a,b);
cout << s << endl;
}
else {
cin >> a;
int k = op2 (bit, a);
cout << k << endl;
}
}
return 0;
}