Pagini recente » Cod sursa (job #942036) | Cod sursa (job #1128427) | Cod sursa (job #3271427) | Cod sursa (job #1047120) | Cod sursa (job #3261255)
#include <bits/stdc++.h>
#define DIM 100001
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, i, x, a, b, Q, task;
int v[DIM], bit[DIM];
int lsb(int n){
return (n & -n);
}
void Update(int i, int val){
for(; i <= n ; i += lsb(i))
bit[i] += val;
}
int Query(int i){
int ret = 0;
for(; i >= 1 ; i -= lsb(i))
ret += bit[i];
return ret;
}
int binary_lifting(){
int ret = 0;
int temp = 0;
for(i=log2(n);i>=0;i--){
if(ret + (1LL << i) <= n && temp + bit[ret + (1LL << i)] <= a){
ret += (1LL << i);
temp += bit[ret + (1LL << i)];
}
}
if(Query(ret) == a)
return ret;
return -1;
}
int main(){
fin >> n >> Q;
for(i=1;i<=n;i++){
fin >> v[i];
Update(i, v[i]);
}
while(Q--){
fin >> task;
if(task == 0){
fin >> a >> b;
Update(a, b - v[i]);
v[i] = b;
}
else if(task == 1){
fin >> a >> b;
fout << Query(b) - Query(a - 1) << "\n";
}
else {
fin >> a;
fout << binary_lifting() << "\n";
}
}
}