Pagini recente » Cod sursa (job #714788) | Cod sursa (job #1113216) | Cod sursa (job #900219) | Cod sursa (job #138795) | Cod sursa (job #2950013)
#include <iostream>
int N, T;
int BIT[100005];
FILE *in = fopen("aib.in", "r"), *out = fopen("aib.out", "w");
int get_sum(int i){
int j = i;
int s = 0;
while(j > 0){
s += BIT[j];
j = j - (j & (-j));
}
return s;
}
void add(int index, int val){
int j = index;
while(j <= N){
BIT[j] += val;
j = j + (j & (-j));
}
}
void read()
{
fscanf(in, "%d %d", &N, &T);
for(int i=1; i <= N; ++i)
{
int val;
fscanf(in, "%d", &val);
add(i, val);
}
}
int main()
{
// Read array
read();
// Read tests and execute them
int type;
int a, b;
int res;
for(int i=0; i < T; ++i)
{
fscanf(in, "%d", &type);
switch(type){
// Add to element at index
case 0: {
fscanf(in, "%d %d", &a, &b);
add(a, b);
break;
}
// Calculate interval sum
case 1: {
fscanf(in, "%d %d", &a, &b);
if(a == 1)
res = get_sum(b);
else
res = get_sum(b) - get_sum(a - 1);
fprintf(out, "%d\n", res);
break;
}
// Sa se determine pozitia minima k astfel incat suma valorilor primilor k termeni sa fie exact a.
case 2: {
fscanf(in, "%d", &a);
int k, L = 1, R = N, M, S;
while (L <= R) {
M = (L + R) / 2;
S = get_sum(M);
if (S < a)
L = M + 1;
else if (S > a)
R = M - 1;
else {
k = M;
break;
}
}
if (S == a)
fprintf(out, "%d\n", k);
else
fprintf(out, "-1\n");
break;
}
}
}
return 0;
}