Pagini recente » Cod sursa (job #2622582) | Cod sursa (job #1291507) | Cod sursa (job #1853486) | Cod sursa (job #3261070) | Cod sursa (job #3261259)
#include <bits/stdc++.h>
#define DIM 100001
#define int long long
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 bin_search(){
int st = 1, dr = n;
int ret = -1;
while(st <= dr){
int mij = (st + dr) >> 1;
if(Query(mij) >= a){
ret = mij;
dr = mij - 1;
}
else st = mij + 1;
}
if(ret < 0)
return -1;
if(Query(ret) != a)
return -1;
return ret;
}
int32_t 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[a] = b;
}
else if(task == 1){
fin >> a >> b;
fout << Query(b) - Query(a - 1) << "\n";
}
else {
fin >> a;
//fout << binary_lifting() << "\n";
fout << bin_search() << "\n";
}
}
}