Pagini recente » Cod sursa (job #2600628) | Cod sursa (job #1750685) | Cod sursa (job #1079504) | Cod sursa (job #557632) | Cod sursa (job #950321)
Cod sursa(job #950321)
#include<fstream>
using namespace std;
int n, aib[100005];
inline int lsb(int &x){
return x & -x; // ((x - 1) ^ x) + 1;
}
void update(int pos, int val){
while(pos <= n){
aib[pos] += val;
pos += lsb(pos);
}
}
int query(int pos){
int ans = 0;
while(pos){
ans += aib[pos];
pos -= lsb(pos);
}
return ans;
}
int main(){
ifstream in("aib.in");
ofstream out("aib.out");
int m;
in >> n >> m;
for(int i = 1; i <= n; ++i){
int x;
in >> x;
update(i, x);
}
for(int i = 1; i <= m; ++i){
int tip;
in >> tip;
if(tip == 0){
int pos, val;
in >> pos >> val;
update(pos, val);
}
else if(tip == 1){
int l, r;
in >> l >> r;
out << query(r) - query(l - 1) << "\n";
}
else{
int x, q;
in >> x;
q = x;
int ans = 0;
for(int i = 1 << 16; i > 0; i >>= 1)
if(i + ans <= n)
if(aib[ans + i] < x){
x -= aib[ans + i];
ans += i;
}
if(ans == 0 && !x)
ans = -1;
++ans;
if(ans != -1 && query(ans) != q)
ans = -1;
out << ans << "\n";
}
}
return 0;
}