Pagini recente » Cod sursa (job #235395) | Cod sursa (job #614284) | Cod sursa (job #1895907) | Cod sursa (job #1080578) | Cod sursa (job #979065)
Cod sursa(job #979065)
#include <cstdio>
using namespace std;
int v[100100];
int n;
void update(int pos,int a){
while(pos<=n){
v[pos]+=a;
pos+=(pos&(pos-1))^pos;
}
}
int query(int pos){
int sum=0;
while(pos>0){
sum+=v[pos];
pos-=(pos&(pos-1))^pos;
}
return sum;
}
int search(int a){
int pos=0;
int pow=1;
while((pow<<1)<=n)
pow<<=1;
while(pow){
if(pos+pow<=n&&v[pos+pow]<=a){
a-=v[pos+pow];
pos+=pow;
}
pow>>=1;
}
if(a)
return -1;
return pos;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n;i++){
int a;
scanf("%d",&a);
update(i,a);
}
for(int i=1;i<=m;i++){
int t;
scanf("%d",&t);
if(t==0){
int pos,val;
scanf("%d%d",&pos,&val);
update(pos,val);
}
else if(t==1){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",query(y)-query(x-1));
}
else {
int sum;
scanf("%d",&sum);
printf("%d\n",search(sum));
}
}
return 0;
}