Pagini recente » Cod sursa (job #2601794) | Cod sursa (job #123185) | Cod sursa (job #2244797) | Cod sursa (job #1667088) | Cod sursa (job #1264062)
#include <stdio.h>
int n, aib[100001];
void update (int poz, int val){
for (;poz <= n;poz = poz + (poz & (poz - 1) ^ poz))
aib[poz] += val;
}
int querry (int poz){
int s;
s = 0;
for(; poz; poz = poz - (poz & (poz - 1) ^ poz))
s =s + aib[poz];
return s;
}
int caut(int val){
int i, poz;
for (poz = 1; poz < n; poz <<= 1);
for(i = 0; poz; poz /= 2){
if(i + poz <= n){
if(val >= aib[i + poz]){
i += poz;
val -= aib[i];
if (val == 0)
return i;
}
}
}
return -1;
}
int main(){
FILE *fin, *fout;
int i, a, b, op, m;
fin = fopen("aib.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (i = 1; i <= n; i++){
fscanf(fin, "%d", &a);
update(i, a);
}
fout=fopen("aib.out","w");
for (i = 0; i < m; i++){
fscanf(fin, "%d", &op);
if (op < 2){
fscanf(fin, "%d%d", &a, &b);
if (op == 0)
update(a ,b);
else
fprintf(fout, "%d\n", querry(b) - querry(a-1));
}
else {
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", caut(a));
}
}
fclose(fin);
fclose(fout);
return 0;
}