Pagini recente » Cod sursa (job #1575014) | Cod sursa (job #405800) | Cod sursa (job #1363627) | Cod sursa (job #1578372) | Cod sursa (job #2193774)
#include <fstream>
using namespace std;
ifstream cin ("aib.in");
ofstream cout ("aib.out");
const int nmax = 100000;
int n, m;
int type, a, b;
int v[1 + nmax];
int aib[1 + nmax];
int lsb(int n) {
return n & -n;
}
void update(int index, int value) {
for(; index <= n; index += lsb(index))
aib[index] += value;
}
int query(int index) {
int answer = 0;
for(; index; index -= lsb(index))
answer += aib[index];
return answer;
}
int search(int value) {
int pas = 0, step = (1 << 17);
for(; step; step >>= 1)
if(pas + step <= n && value >= aib[pas + step]) {
value -= aib[pas + step];
pas += step;
if(value == 0)
return pas;
}
return -1;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= m; i++) {
cin >> type;
if(type == 0) {
cin >> a >> b;
update(a, b);
} else if(type == 1) {
cin >> a >> b;
cout << query(b) - query(a - 1) << "\n";
} else {
cin >> a;
cout << search(a) << "\n";
}
}
return 0;
}