Pagini recente » Cod sursa (job #3340916) | Cod sursa (job #3345835) | Cod sursa (job #3345869) | Cod sursa (job #3352285) | Cod sursa (job #3333573)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 1e5+1;
int n, m, aib[NMAX], x, op, a, b;
void update(int pos, int val){
for(int i=pos; i<= n; i+=(i&(-i)))
aib[i]+=val;
}
int query(int poz){
int ans=0;
for(int i=poz;i>0;i-=(i&(-i)))
ans+=aib[i];
//cout<<ans<<endl;
return ans;
}
int cautare(int ans){
int pos=0, nextp=1, sum=0;
while(nextp*2<=n)
nextp*=2;
while(nextp>0){
if(nextp+pos<=n){
if(sum+aib[pos+nextp]<=ans){
pos+=nextp;
sum+=aib[pos];
if(sum==ans)
return pos;
}
}
nextp/=2;
}
return -1;
}
int main(){
fin>>n>>m;
for(int i=1;i<=n;i++){
fin>>x;
update(i, x);
}
while(m--){
fin>>op;
//cout<<op<<endl;
if(op==0){
fin>>a>>b;
update(a, b);
}
else if(op==1){
fin>>a>>b;
fout<<query(b)-query(a-1)<<'\n';
}
else{
fin>>a;
fout<<cautare(a)<<'\n';
}
}
return 0;
}