Pagini recente » Cod sursa (job #2523226) | Cod sursa (job #2288398) | Cod sursa (job #2374336) | Cod sursa (job #2514415) | Cod sursa (job #2917525)
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const int MAX_N = 100005;
int n, input[MAX_N];
struct FENWICK{
int aib[2 * MAX_N];
inline int lsb(int k){
return (k & (-k));
}
inline void build(){
for(int i=1; i<=n; i++){
aib[i] += input[i];
if(i + lsb(i) <= n)
aib[i + lsb(i)] += aib[i];
}
}
inline void update(int nod, int val){
while(nod <= n){
aib[nod] += val;
nod += lsb(nod);
}
}
inline int prefix(int nod){
int answer = 0;
while(nod > 0){
answer += aib[nod];
nod -= lsb(nod);
}
return answer;
}
} tree;
const int MAX_Q = 100005;
int qcnt, type, a, b;
int main (){
ios_base::sync_with_stdio(false);
fin.tie(nullptr), fout.tie(nullptr);
fin>>n>>qcnt;
for(int i=1; i<=n; i++)
fin>>input[i];
tree.build();
while(qcnt--){
fin>>type;
if(type == 0){ ///update
fin>>a>>b;
tree.update(a, b);
}else if(type == 1){ ///suma pe interval
fin>>a>>b;
fout<<tree.prefix(b) - tree.prefix(a-1)<<"\n";
}else{ ///cautare binara
fin>>a;
int st=1, md, dr=n, sum, save=-1;
while(st <= dr){
md = st + ((dr - st) >> 1);
sum = tree.prefix(md);
if(sum == a){
save = md;
break;
}
if(sum < a) st = md + 1;
if(sum > a) dr = md - 1;
}
fout<<save<<"\n";
}
}
return 0;
}