Pagini recente » Cod sursa (job #2525303) | Cod sursa (job #2508428) | Cod sursa (job #1876796) | Cod sursa (job #2549364) | Cod sursa (job #1622378)
#include<cstdio>
using namespace std;
int n,m,x,a,b,v[100001],t;
void adauga(int val,int poz){
v[poz]+=val;
while((poz+(poz&(-poz)))<=n){
poz+=poz&(-poz);
v[poz]+=val;
}
}
int sum(int poz1,int poz2){
int s=0;
//poz2
s+=v[poz2];
while(poz2&(poz2-1)){
poz2=poz2&(poz2-1);
s+=v[poz2];
}
//poz1
poz1--;
s-=v[poz1];
while(poz1&(poz1-1)){
poz1=poz1&(poz1-1);
s-=v[poz1];
}
return s;
}
int bin(int val){
int l1,l2,minim;
l1=1;
l2=n;
minim=-1;
while(l1<=l2){
int mij=(l1+l2)/2;
int s=sum(1,mij);
if(s==val){
minim=mij;
l2=mij-1;
}
else
if(s<val)
l1=mij+1;
else
if(s>val)
l2=mij-1;
}
return minim;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&x);
adauga(x,i);
}
for(int i=1;i<=m;i++){
scanf("%d",&t);
if(t==0){
scanf("%d%d",&a,&b);
adauga(b,a);
}
else
if(t==1){
scanf("%d%d",&a,&b);
printf("%d\n",sum(a,b));
}
else
if(t==2){
scanf("%d",&a);
printf("%d\n",bin(a));
}
}
return 0;
}