Cod sursa(job #2396281)

Utilizator AndoneAlexandruAndone Alexandru AndoneAlexandru Data 3 aprilie 2019 13:03:55
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#define NMAX 100005
#define zero(x) x&(-x)
using namespace std;

int n, m;
int arr[NMAX], arb[NMAX];

void adaugare(int el, int poz) {
    for (int i = poz; i <= n; i += zero(i)) {
        arb[i] += el;
    }
}

int suma(int poz) {
    int s = 0;
    for (int i = poz; i > 0; i -= zero(i))
        s += arb[i];
    return s;
}

int suma_primelor(int x) {
    int lg = 1, i;

    for (lg; lg <= n; lg <<= 1);
    for (i = 1; lg != 0; lg >>= 1) {
        if (i + lg <= n && suma(i+lg) <= x)
            i += lg;
    }
    if (suma(i) != x)
        return -1;
    return i;
}

int main() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    scanf("%d %d\n", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d ", &arr[i]);
        adaugare(arr[i], i);
    }
    scanf("\n");
    for (int x = 1; x <= m; ++x) {
        int cod, a, b;
        scanf("%d ", &cod);
        if (cod == 0) {
            scanf("%d %d\n", &a, &b);
            arr[a] += b;
            adaugare(b, a);
        }
        else if (cod == 1) {
            scanf("%d %d\n", &a, &b);
            printf("%d\n", suma(b) - suma(a-1));
        }
        else {
            scanf("%d\n", &a);
            printf("%d\n", suma_primelor(a));
        }
    }
    return 0;
}