Pagini recente » Autentificare | Cod sursa (job #3364512) | Cod sursa (job #3364533) | Cod sursa (job #3364535) | Cod sursa (job #3364528)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n, m;
class FenwickTree {
vector<int> tree;
int size;
void update_(int pos, int val) {
for (int i = pos ; i <= n ; i += i & -i) {
tree[i] += val;
}
}
int query_(int pos) {
int ans = 0;
for (int i = pos ; i > 0 ; i -= i & -i) {
ans += tree[i];
}
return ans;
}
public:
FenwickTree(int size) {
this->size = size;
tree.assign(size + 2, 0);
}
void update(int pos, int val) {
update_(pos, val);
}
int query(int query_left, int query_right) {
return query_(query_right) - query_(query_left - 1);
}
int exact_sum_position(int sum) {
int ans_idx = 0, current_sum = 0;
for (int i = 1 << 30 ; i > 0 ; i >>= 1) {
if (ans_idx + i <= n && current_sum + tree[ans_idx + i] < sum) {
ans_idx += i;
current_sum += tree[ans_idx];
}
}
if (ans_idx + 1 > n || query_(ans_idx + 1) != sum) {
return -1;
}
return ans_idx + 1;
}
};
int main() {
cin >> n >> m;
FenwickTree t(n);
for (int i = 1 ; i <= n ; ++i) {
int val; cin >> val;
t.update(i, val);
}
while (m--) {
int type; cin >> type;
if (type == 0) {
int a, b; cin >> a >> b;
t.update(a, b);
}
if (type == 1) {
int a, b; cin >> a >> b;
cout << t.query(a, b) << "\n";
}
if (type == 2) {
int a; cin >> a;
cout << t.exact_sum_position(a) << "\n";
}
}
return 0;
}