Pagini recente » Cod sursa (job #2417760) | Cod sursa (job #1706374) | Cod sursa (job #652468) | Cod sursa (job #538792) | Cod sursa (job #195500)
Cod sursa(job #195500)
#include<stdio.h>
#include<string.h>
#define bit 100005
inline int min(int a, int b) {
if(a<b)
return a;
return b;
}
int n,m,T;
int Arb[bit];
int C,S;
int Query(int poz){
C=0,S=0;
while(poz>0){
S+=Arb[poz];
while(!(poz&(1<<C)))
C++;
poz-=(1<<C);
C+=1;
}
return S;
}
int solve(int Sum){
int pos=n+1,B;
int limst=0, limdr=n+1;
B=n;
S=Query(B);
if(S==Sum)
pos=n;
while(B){
B=(limst+limdr)>>1;
S=Query(B);
if(S>Sum){
if(limdr>B)
limdr=B;
B-=1;
}
else
if(S==Sum)
pos=min(pos,B), limdr=B, B-=1;
else{
if(limst<B)
limst=B;
B+=1;
}
if(B<=limst)
break;
if(B>=limdr)
break;
}
if(pos==n+1)
return -1;
return pos;
}
void Update(int poz, int val){
C=0;
while(poz<=n){
Arb[poz]+=val;
while(!(poz&(1<<C)))
C++;
poz+=(1<<C);
C+=1;
}
}
int main(){
memset(Arb,0,sizeof(Arb));
int K,X,Y;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&T);
Update(i,T);
}
for(;m;--m){
scanf("%d",&K);
if(K<2){
scanf("%d%d",&X,&Y);
if(!K)
Update(X,Y);
else
printf("%d\n",Query(Y)-Query(X-1));
}
else{
scanf("%d",&X);
printf("%d\n",solve(X));
}
}
}