Pagini recente » Cod sursa (job #1285950) | Cod sursa (job #2956307) | Cod sursa (job #2042236) | Cod sursa (job #1136035) | Cod sursa (job #1183075)
#include <stdio.h>
#define MAXN 100000
long long aib[MAXN+1], n;
inline long long ub(long long a){
return a&(-a);
}
inline void add(long long poz, long long val){
long long i;
for(i=poz; i<=n; i+=ub(i)){
aib[i]+=val;
}
}
inline long long sum(long long a){
long long i, s;
s=0;
for(i=a; i!=0; i-=ub(i)){
s+=aib[i];
}
return s;
}
int main(){
long long m, i, x, t, a, b, rez, pas;
FILE *fin, *fout;
fin=fopen("aib.in", "r");
fout=fopen("aib.out", "w");
fscanf(fin, "%lld%lld", &n, &m);
for(i=1; i<=n; i++){
fscanf(fin, "%lld", &x);
add(i, x);
}
for(i=1; i<=m; i++){
fscanf(fin, "%lld", &t);
switch(t){
case 0 :
fscanf(fin, "%lld%lld", &a, &b);
add(a, b);
break;
case 1 :
fscanf(fin, "%lld%lld", &a, &b);
fprintf(fout, "%lld\n", sum(b)-sum(a-1));
break;
default :
fscanf(fin, "%lld", &a);
rez=0;
for(pas=1<<16; pas!=0; pas>>=1){
if((pas+rez<=n)&&(sum(rez+pas)<=a)){
rez+=pas;
}
}
if(sum(rez)==a){
fprintf(fout, "%lld\n", rez);
}else{
fprintf(fout, "-1\n");
}
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}