Pagini recente » Cod sursa (job #304220) | Cod sursa (job #1125380) | Cod sursa (job #180410) | Cod sursa (job #1530038) | Cod sursa (job #1143755)
#include<stdio.h>
using namespace std;
FILE *f,*g;
long long aib[100001];
int n;
int next(int i){
return ((i<<1)-(i&(i-1)));
}
int prev(int i){
return i&(i-1);
}
void update(int a,int b){
while(a<=n){
aib[a]+=(long long)b;
a=next(a);
}
}
long long query(int a){
long long sol=0;
while(a){
sol+=aib[a];
a=prev(a);
}
return sol;
}
long long query(int a, int b){
return query(b)-query(a-1);
}
int ques(int k){
int 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){
int m,i,x,a,b;
f=fopen("aib.in","r");
g=fopen("aib.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&a);
update(i,a);
}
for(i=1;i<=m;i++){
fscanf(f,"%d",&x);
if (x==0||x==1){
fscanf(f,"%d%d",&a,&b);
if (x) fprintf(g,"%lld\n",query(a,b));
else update(a,b);
}
else {
fscanf(f,"%d",&a);
fprintf(g,"%d\n",ques(a));
}
}
}
int main(void){
read();
return 0;
}