Pagini recente » Cod sursa (job #2863989) | Cod sursa (job #397319) | Cod sursa (job #1944979) | Cod sursa (job #22746) | Cod sursa (job #1099097)
#include <cstdio>
#define NMAX 100001
int n,m;
int V[NMAX];
inline void update(int ind,int val){
int poz = 0;
while(ind <=n){
V[ind]+=val;
while(!(ind & (1<<poz)))
++poz;
ind += (1<<poz);
poz++;
}
}
inline int Sum(int dr){
int S = 0;
int poz = 0;
while(dr > 0){
S+= V[dr];
while(!(dr & (1<<poz)))
poz++;
dr = dr - (1<<poz);
poz++;
}
return S;
}
inline 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;
}