Pagini recente » Cod sursa (job #2524037) | Cod sursa (job #1716758) | Cod sursa (job #1601509) | Cod sursa (job #2984989) | Cod sursa (job #2818371)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100000
#define MAXP2 30
int v[NMAX];
static inline int LastBit(int x){
return x & (-x);
}
int query(int x){
int s = 0;
while(x >= 0){
s += v[x];
x -= LastBit(x+1);
}
return s;
}
//int search(int k, int n){
// int p, step, s;
// s = 0;
// p = 0;
//
// for(step = 1<<MAXP2; step > 0; step/=2){
// if(p+step < n && s + v[p+step] <= k){
// s += v[p+step];
// p += step;
// }
// }
//
// return p;
//}
int search(int k, int n){
int p, step;
p = 0;
for(step = 1<<MAXP2; step > 0; step/=2){
// if(p+step<n)
// printf("! %d\n",query(step+p));
if(p+step < n && query(step + p) <= k){
p += step;
}
}
return p;
}
int main(){
int n,m,i,j,t,a,b;
FILE *fin, *fout;
fin = fopen("aib.in","r");
fscanf(fin,"%d%d",&n,&m);
for(i=0;i<n;i++)
fscanf(fin,"%d",&v[i]);
for(i=0;i<n;i++){
if(i + LastBit(i+1) < n)
v[i + LastBit(i+1)] += v[i];
}
fout = fopen("aib.out","w");
for(i=0;i<m;i++){
// for(int ii=0;ii<n;ii++)
// printf("%d ",v[ii]);
// printf("\n");
fscanf(fin,"%d",&t);
if(t == 0){
fscanf(fin,"%d%d",&a,&b);
j = a;
while(j < n){
v[j] += b;
j += LastBit(j+1);
}
} else if(t == 1){
fscanf(fin,"%d%d",&a,&b);
fprintf(fout,"%d\n",query(b-1) - query(a-2));
} else{
fscanf(fin,"%d",&a);
if(a == query(search(a,n)))
fprintf(fout,"%d\n",search(a,n) +1);
else
fprintf(fout,"-1\n");
}
// printf("\n");
}
fclose(fin);
fclose(fout);
return 0;
}