Pagini recente » Cod sursa (job #884678) | Cod sursa (job #2363775) | Cod sursa (job #2055667) | Cod sursa (job #2212392) | Cod sursa (job #1461144)
#include <iostream>
#include <fstream>
using namespace std;
int n, m, mlg, aib[100003];
inline void mlp (){
mlg = 1;
for (; mlg < n ; mlg <<= 1);
}
inline int query (int x){
int ret;
for (ret = 0; x; x -= x & -x)
ret += aib[x];
return ret;
}
inline void update(int i, int val){
for (; i <= n; i += i & -i)
aib[i] += val;
}
inline int pos (int val){
int step = mlg, i;
for (i = 0; step; step >>= 1)
if (i + step <= n && val >= aib[i + step]){
i += step, val -= aib[i];
if (!val) return i;
}
return -1;
}
int main(){
ifstream cin ("aib.in");
ofstream cout ("aib.out");
cin >> n >> m;
for (int i = 1 ; i <= n; i++){
int x;
cin >> x, update(i, x);
}
mlp();
for (int i = 1; i <= m; i++){
int t, x, y;
cin >> t >> x;
if (t == 0){
cin >> y;
update(x , y);
}
if (t == 1){
cin >> y;
cout << query(y) - query(x - 1) << "\n";
}
if (t == 2)
cout << pos(x) << "\n";
}
return 0;
}