Pagini recente » Cod sursa (job #1416902) | Cod sursa (job #1761664) | Cod sursa (job #1069842) | Cod sursa (job #1149458) | Cod sursa (job #3311115)
#include <bits/stdc++.h>
using namespace std;
int lsb(int x) {
return x & (-x);
}
struct AIB {
vector<int> a;
int n;
AIB(int M) {
n = M;
a.resize(n);
}
void update(int p, int val) {
if(p > n)
return;
a[p - 1] += val;
update(p + lsb(p), val);
}
int sp(int p) {
if(p == 0)
return 0;
return a[p - 1] + sp(p - lsb(p));
}
int op2(int x) {
int st = 1, dr = n;
while(st <= dr) {
int mj = (st + dr) / 2;
int rez = sp(mj);
if(rez < x) {
st = mj + 1;
} else if(rez > x) {
dr = mj - 1;
} else {
return mj;
}
}
return -1;
}
int query(int x, int y) {
return sp(y) - sp(x - 1);
}
};
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m; cin >> n >> m;
AIB aib(n);
for(int i = 0; i < n; i ++) {
int x; cin >> x;
aib.update(i + 1, x);
}
for(int i = 0; i < m; i ++) {
int cer; cin >> cer;
if(cer == 0) {
int x, y; cin >> x >> y;
aib.update(x, y);
} else if(cer == 1) {
int x, y; cin >> x >> y;
cout << aib.query(x, y) << '\n';
} else {
int x; cin >> x;
cout << aib.op2(x) << '\n';
}
}
}