Pagini recente » Cod sursa (job #301600) | Cod sursa (job #1357805) | Cod sursa (job #887265) | Cod sursa (job #2165873) | Cod sursa (job #2027165)
#include <cstdio>
using namespace std;
#define Nmax 100005
int v,aib[Nmax],n,m;
int suma(int x){
int s=0;
while(x!=0){
s+=aib[x];
x=x&(x-1);
}
return s;
}
void adaug(int x,int v){
do
{
aib[x]+=v;
x+=x&(-x);
}
while(x<=n);
}
int poz(int x){
int st=1,dr=n,mij,s,p=-1;;
while(st<=dr){
mij=(st+dr)/2;
s=suma(mij);
if(s==x){
p=mij;
dr=mij-1;
}
else
if(s>x)
dr=mij-1;
else
st=mij+1;
}
return p;
}
int main()
{
int a,b,op;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d", &v);
adaug(i,v);
}
for(int i=1;i<=m;i++){
scanf("%d",&op);
switch(op){
case 0: {
scanf("%d%d",&a,&b);
adaug(a,b);
break;
}
case 1:{
scanf("%d%d",&a,&b);
printf("%d\n",suma(b)-suma(a-1));
break;
}
case 2:{
scanf("%d",&a);
printf("%d\n", poz(a));
}
}
}
return 0;
}