Pagini recente » Cod sursa (job #74244) | Cod sursa (job #3353328) | Cod sursa (job #3353797) | Cod sursa (job #3349059) | Cod sursa (job #3334282)
#include<iostream>
using namespace std;
#define NMAX 100001
int n,aib[NMAX];
void update(int ind,int val){
for(;ind<=n;ind+=(ind&-ind)){
aib[ind]+=val;
}
}
int query(int ind){
int sum=0;
for(;ind>0;ind-=(ind&-ind)){
sum+=aib[ind];
}
return sum;
}
int lastk(int k){
int st=1,dr=n,ans=-1;
while(st<=dr){
int mij=(st+dr)/2;
int q=query(mij);
if(k<=q){
if(q==k){
ans=mij;
}
dr=mij-1;
}else{
st=mij+1;
}
}
return ans;
}
int main(void){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int q;
cin>>n>>q;
for(int i=1;i<=n;++i){
int x;
cin>>x;
update(i,x);
}
for(;q;--q){
int op;
cin>>op;
if(op==0){
int x,y;
cin>>x>>y;
update(x,y);
}else if(op==1){
int x,y;
cin>>x>>y;
if(x>y)swap(x,y);
cout<<query(y)-query(x-1)<<"\n";
}else{
int x;
cin>>x;
cout<<lastk(x)<<"\n";
}
}
return 0;
}