Pagini recente » Cod sursa (job #1396745) | Cod sursa (job #1347803) | Cod sursa (job #196423) | Cod sursa (job #2112578) | Cod sursa (job #1099102)
#include <cstdio>
#define NMAX 100001
int n,m;
int V[NMAX];
int zero(int x){
return (x^(x-1))&x;
}
void update(int ind,int val){
int poz = 0;
while(ind <=n){
V[ind]+=val;
ind += zero(ind);
}
}
int Sum(int dr){
int S = 0;
int poz = 0;
while(dr > 0){
S+= V[dr];
dr -= zero(dr);
}
return S;
}
int Search(int x){
int left = 1;
int right = n;
int m;
while(left<=right){
m = (left+right)/2;
if(Sum(m) == x)
return m;
if(Sum(m) < x)
left = m+1;
else right = m-1;
}
return -1;
}
int main(){
int a,b;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
int val;
for(register int i=1;i<=n;++i){
scanf("%d",&val);
update(i,val);
}
int option;
while(m){
scanf("%d",&option);
if(option < 2){
scanf("%d%d",&a,&b);
if(!option)
update(a,b);
else printf("%d\n",Sum(b) - Sum(a-1));
}
else {scanf("%d",&a);
printf("%d\n",Search(a));
}
--m;
}
return 0;
}