Pagini recente » Cod sursa (job #405858) | Cod sursa (job #1256432) | Cod sursa (job #3231956) | Cod sursa (job #2631901) | Cod sursa (job #584346)
Cod sursa(job #584346)
//metoda naiva => modificare O(1), interogare O(n)
//metoda vector de sume => modificare O(n), interogate O(1)
// => pt interogari rapide + meodificari in timp real = arbori indexati binar => O(m*log(n))
#include "stdio.h"
#include "math.h"
#include <cstdlib>
using namespace std;
int N, M;
int *aib;
int getZeros(int x){
int nr = 0;
while (x % 2 == 0){
x /= 2;
++nr;
}
return nr;
}
void modifica(int index, int value){
for (int i = index; i <= N + 1; i += pow(2, getZeros(i)))
aib[i] -= value;
}
int interogheaza(int index){
int sum = 0;
for (int i = index; i > 0; i -= pow(2, getZeros(i)))
sum += aib[i];
return sum;
}
int main(){
FILE *in = fopen("datorii.in", "r");
FILE *out = fopen("datorii.out", "w");
fscanf(in, "%d %d", &N, &M);
aib = (int*)calloc(N + 1, sizeof(int));
for (int i = 1, x; i < N + 1; ++i){
fscanf(in, "%d", &x);
modifica(i, -x);
}
for (int i = 0, cod, a, b; i < M; ++i){
fscanf(in, "%d %d %d", &cod, &a, &b);
if (cod == 0) modifica(a, b);
else fprintf(out, "%d\n", interogheaza(b)- interogheaza(a-1));
}
fclose(in);
fclose(out);
return 0;
}