Pagini recente » Cod sursa (job #3220665) | Cod sursa (job #2723997) | Cod sursa (job #3264705) | Cod sursa (job #3175472) | Cod sursa (job #2819689)
#include <stdio.h>
#include <stdlib.h>
#define MAXX 100001
int aib[MAXX], v[MAXX];
void modif(int n, int p, int a){
int lsb;
while(p <= n) {
aib[p] += a;
lsb = p & -p;
p += lsb;
}
}
int caut(int n, int a){
int p, l, s, ok;
l = 1 << 16;
p = s = ok = 0;
while(l > 0){
if(l + p <= n && aib[p + l] + s <= a) {
ok = 1;
p += l;
s += aib[p];
}
l /=2;
}
if(ok == 0 || s != a)
p = -1;
return p;
}
void calc(int n) {
int i, lsb;
for(i = 1; i <= n; i++) {
aib[i] += v[i];
lsb = i & -i;
if(i + lsb <= n)
aib[i + lsb] += aib[i];
}
}
int intreb(int p) {
int af, lsb;
af = 0;
while(p > 0) {
af += aib[p];
lsb = p & -p;
p -= lsb;
}
return af;
}
int main(){
FILE *fin,*fout;
int q,n,m,i,a,b;
fin = fopen("aib.in", "r");
fout = fopen("aib.out", "w");
fscanf(fin, "%d%d", &n,&m);
for(i = 1; i <= n; i++)
fscanf(fin, "%d", &v[i]);
calc(n);
for(i = 0; i < m; i++) {
fscanf(fin, "%d", &q);
if(q == 0 || q == 1) {
fscanf(fin, "%d%d", &a,&b);
if(q == 0)
modif(n, a, b);
else{
a--;
fprintf(fout, "%d\n", intreb(b) - intreb(a));
}
}
else {
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", caut(n, a));
}
}
fclose(fin);
fclose(fout);
return 0;
}