Pagini recente » Cod sursa (job #1532543) | Profil mamaie | Cod sursa (job #1345866) | Cod sursa (job #50005) | Cod sursa (job #1143784)
#include<stdio.h>
using namespace std;
FILE *f,*g;
long long aib[100009];
long long n;
long long next(long long i){
return ((i<<1)-(i&(i-1)));
}
long long prev(long long i){
return i&(i-1);
}
void update(long long a,long long b){
while(a<=n){
aib[a]+=b;
a=next(a);
}
}
long long query(long long a){
long long sol=0;
while(a){
sol+=aib[a];
a=prev(a);
}
return sol;
}
long long query(long long a, long long b){
return query(b)-query(a-1);
}
long long ques(long long k){
long long r=n,l=n,mid;
long long sol=query(n),s;
if (k>sol) return -1;
while (sol>k){
sol-=aib[l];
r=l;
l=prev(l);
}
while(r-l>1){
mid=(r+l)/2;
s=aib[mid];
if (sol+s<=k) {l=mid;sol+=s;}
else r=mid;
}
if (sol==k) return l;
else return -1;
}
void read(void){
long long m,i,x,a,b;
f=fopen("aib.in","r");
g=fopen("aib.out","w");
fscanf(f,"%lld%lld",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%lld",&a);
update(i,a);
}
for(i=1;i<=m;i++){
fscanf(f,"%lld",&x);
if (x==0||x==1){
fscanf(f,"%lld%lld",&a,&b);
if (x) fprintf(g,"%lld\n",query(a,b));
else update(a,b);
}
else {
fscanf(f,"%lld",&a);
fprintf(g,"%lld\n",ques(a));
}
}
}
int main(void){
read();
return 0;
}