Cod sursa(job #2301357)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 12 decembrie 2018 21:02:36
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>

using namespace std;

void actualizeaza(int start, int b, int n, int *AIB) {
    for (int i = start; i <= n; i += i & (-i))
        AIB[i] -= b;
}

int interogheaza(int start, int *AIB) {
    int suma = 0;
    while (start > 0) {
        suma += AIB[start];
        start -= start & (-start);
    }
    return suma;
}

void construieste_AIB(int start, int stop, int *AIB, int *A) {
    for (int i = start; i <= stop; i++)
        AIB[i] = A[i];
    int j;
    for (int i = start; i <= stop; i++) {
        j = i + (i & (-i));
        if (j <= stop)
            AIB[j] += AIB[i];
    }
}

int main() {
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	int n, m, cod, a, b;
	scanf("%d %d", &n, &m);
    int A[n + 1], AIB[n + 1] = {0};
    for (int i = 1; i <= n; i++)
        scanf("%d", &A[i]);
    construieste_AIB(1, n, AIB, A);
    for (int i = 0; i < m; i++) {
        scanf("%d %d %d", &cod, &a, &b);
        if (cod == 0)
            actualizeaza(a, b, n, AIB);
        else
            printf("%d\n", interogheaza(b, AIB) - interogheaza(a - 1, AIB));
    }
	return 0;
}