Pagini recente » Cod sursa (job #46304) | Cod sursa (job #345389) | Cod sursa (job #1070157) | Cod sursa (job #671226) | Cod sursa (job #627387)
Cod sursa(job #627387)
#include <stdio.h>
int c[100002],n,m;
int zero(int x){
int i;
for(i=0;!(x&1<<i);i++); return 1<<i;
}
void update(int i,int x){
for(;i<=n;i+=zero(i))c[i]+=x;
}
int query(int i){
int x=0;
for(;i>0;i-=zero(i))x+=c[i]; return x;
}
int cb(int st,int dr,int x){
if(st==dr){ if(st==0||st==n-1)return -1;else
if(query(dr)==x)return dr; else return -1; } else {
int md=(st+dr)/2;
if(query(md)<x)return cb(md+1,dr,x); else return cb(st,md,x); }
}
void read_data(){
int i,x,y,op;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&x);
update(i,x); };
for(i=1;i<=m;i++){
scanf("%d",&op);
if(op<2){
scanf("%d%d",&x,&y);
if(op==0)update(x,y); else printf("%d\n",query(y)-query(x-1)); } else
{
scanf("%d",&x);
printf("%d\n",cb(0,n+1,x));
}
}
}
int main(){
read_data();
}