Pagini recente » Cod sursa (job #1595876) | Cod sursa (job #256147) | Cod sursa (job #1595990) | Cod sursa (job #703612) | Cod sursa (job #872757)
Cod sursa(job #872757)
#include<cstdio>
using namespace std;
#define MAX 100001
int v[MAX],n,m;
void Add(int ind,int val){
int nr0=0;
while(ind<=n){
v[ind]+=val;
while(!(ind &(1<<nr0))) nr0++;
ind+=(1<<nr0);
nr0++;
}
}
int SecvSum(int ind){
int nr0=0,sum=0;
while(ind>0){
sum+=v[ind];
while(!(ind &(1<<nr0))) nr0++;
ind-=(1<<nr0);
nr0++;
}
return sum;
}
int FindKmin(int val){
int i,pas;
for(pas=1;pas<n;pas<<=1);
for(i=0;pas;pas>>=1){
if(i+pas<=n)
if(val>=v[i+pas]){
i+=pas;
val-=v[i];
if(!val)
return i;
}
}
return -1;
}
int main(){
int i,x,a,b;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&x);
Add(i,x);
}
while(m--){
scanf("%d",&x);
if(x==0){
scanf("%d%d",&a,&b);
Add(a,b);
}
else if(x==1){
scanf("%d%d",&a,&b);
printf("%d\n",SecvSum(b)-SecvSum(a-1));
}
else if(x==2){
scanf("%d",&a);
printf("%d\n",FindKmin(a));
}
}
fclose(stdin);
fclose(stdout);
return 0;
}