Pagini recente » Cod sursa (job #1596868) | Cod sursa (job #609123) | Cod sursa (job #481266) | Cod sursa (job #1571285) | Cod sursa (job #3309568)
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int aib[100005], n,q,tip,a,b;
void update(int a, int val){
while(a<=n){
aib[a]+=val;
a+=(a&(-a));
}
}
int sum(int a, int b){
if(a!=1)
return sum(1,b)-sum(1,a-1);
int ans=0;
while(b){
ans+=aib[b];
b=b&(b-1);
}
return ans;
}
int query(int a){
int p=1<<20, r=0, sum=0, ans=-1;
while(p){
if(r+p<=n && sum+aib[r+p]==a)
ans=r+p;
if(r+p<=n && sum+aib[r+p]<a){
sum+=aib[r+p];
r+=p;
}
p/=2;
}
return ans;
}
int main()
{
cin>>n>>q;
for(int i=1; i<=n;i++){
cin>>a;
update(i,a);
}
while(q--){
cin>>tip;
if(tip==0){
cin>>a>>b;
update(a,b);
}
else if(tip==1){
cin>>a>>b;
cout<<sum(a,b)<<'\n';
}
else{
cin>>a;
cout<<query(a)<<'\n';
}
}
return 0;
}