Pagini recente » Cod sursa (job #307678) | Cod sursa (job #2204323) | Cod sursa (job #2526922) | Cod sursa (job #400496) | Cod sursa (job #2966691)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout("aib.out");
const int NMAX = 100005;
int n, m;
int op, a, b;
int v[NMAX], aib[NMAX];
int get_sum(int i) {
int sum = 0;
while (i) {
sum += aib[i];
i -= i & -i;
}
return sum;
}
void update(int i, int val) {
while (i <= n) {
aib[i] += val;
i += i & -i;
}
}
void create_aib() {
///aib initializat initial cu 0
///O(n*log(n))
for (int i = 1; i <= n; i++)
update(i, v[i]);
}
//void make_aib() {
// ///O(n)
//
//}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> v[i];
create_aib();
while(m--) {
fin >> op;
if (op == 0) {
fin >> a >> b;
v[a] += b;
update(a, b);
}
else if (op == 1) {
fin >> a >> b;
fout << get_sum(b) - get_sum(a-1) << '\n';
}
else {
fin >> a;
int k = 1, ok = 0;
while (k <= n && !ok) {
int sum = get_sum(k);
if (sum == a) {
ok = 1;
}
k++;
}
k--;
if (ok)
fout << k << '\n';
else
fout << -1 << '\n';
}
}
return 0;
}