Pagini recente » Cod sursa (job #3134669) | Cod sursa (job #314092) | Cod sursa (job #621994) | Cod sursa (job #519241) | Cod sursa (job #1183193)
#include<cstdio>
using namespace std;
int aib[100001];
int n;
int ub(int x){
return (x&(-x));
}
void add(int x,int y){
int i;
for(i=x;i<=n;i+=ub(i))
aib[i]+=y;
}
int sum(int x){
int i,s=0;
for(i=x;i>0;i-=ub(i))
s+=aib[i];
return s;
}
int cb(int x){
int in=1,sf=n,m,k;
while(in<sf){
m=(in+sf)/2;
k=sum(m);
if (k==x) return m;
else
if (k<x) in=m+1;
else sf=m;
}
if (sum(sf)==x) return sf;
return -1;
}
int main(){
freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
int i,p,x,y,m;
scanf ("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf ("%d",&x);
add(i,x);
}
for(i=1;i<=m;i++){
scanf ("%d",&p);
if (p==0){
scanf ("%d%d",&x,&y);
add(x,y);
}
else
if (p==1){
scanf ("%d%d",&x,&y);
printf ("%d\n",sum(y)-sum(x-1));
}
else {
scanf ("%d",&x);
printf ("%d\n",cb(x));
}
}
return 0;
}