Pagini recente » Cod sursa (job #876175) | Cod sursa (job #2493502) | Cod sursa (job #1350559) | Cod sursa (job #2586919) | Cod sursa (job #1143754)
#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]+=b;
a=next(a);
}
}
int query(int a){
long long sol=0;
while(a){
sol+=aib[a];
a=prev(a);
}
return sol;
}
int query(int a, int b){
return query(b)-query(a-1);
}
int ques(int k){
int r=n,l=n,s,mid;
int sol=query(n);
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,"%d\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;
}