Pagini recente » Cod sursa (job #1227372) | Cod sursa (job #2488777) | Cod sursa (job #1057343) | Cod sursa (job #769738) | Cod sursa (job #1452147)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
template<typename Int>
class FenwickTree {
public:
FenwickTree() {}
FenwickTree(int n) {
this->n = n;
bit.resize(n + 5);
int lim = 1;
while (lim <= n)
lim *= 2;
this->lim = lim;
}
template<typename Array>
FenwickTree(int n, Array& v) {
this->n = n;
bit.resize(n + 5);
build(n, v);
int lim = 1;
while (lim <= n)
lim *= 2;
this->lim = lim;
}
void update(int poz, Int &val) {
return update(n, poz, val);
}
Int sum(int left, int right) {
return summ(n, right) - summ(n, left - 1);
}
Int sum(int poz) {
return sum(n, poz);
}
int query(Int& val) {
return query(n, val);
}
private:
vector<Int> bit;
int n, lim;
void update(int n, int poz, Int& val) {
for (int i = poz; i <= n; i += i & (-i))
bit[i] += val;
}
Int summ(int n, int poz) {
Int r = 0;
for (int i = poz; i; i -= i & (-i))
r += bit[i];
return r;
}
int query(int n, Int& x) {
int poz = 0;
Int y = x;
for (int step = lim; step; step /= 2)
if (poz + step < n && bit[poz + step] < x) {
x -= bit[poz + step];
poz += step;
}
return (summ(n, poz + 1) == y) ? poz + 1 : -1;
}
template<typename Array>
void build(int n, Array& v) {
for (int i = 1; i <= n; i++)
update(i, v[i]);
}
};
FenwickTree<int> myTree;
int main() {
cin.sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
#endif
int n, q;
cin >> n >> q;
myTree = FenwickTree<int>(n);
for (int i = 1; i <= n; i++) {
int val;
cin >> val;
myTree.update(i, val);
}
for (; q; q--) {
int op;
cin >> op;
if (op == 0) {
int poz, val;
cin >> poz >> val;
myTree.update(poz, val);
} else if (op == 1) {
int a, b;
cin >> a >> b;
printf("%d\n", myTree.sum(a, b));
} else {
int val;
cin >> val;
printf("%d\n", myTree.query(val));
}
}
return 0;
}