Cod sursa(job #2587192)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 22 martie 2020 14:08:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <stdio.h>

using namespace std;

const int NMAX = 100005;
int n;
int v[NMAX], s[NMAX];

int len(int x) {
    return (x - (x & (x - 1)));
}

void update(int pz, int val) {
    while (pz <= n) {
        s[pz] += val;
        pz += len(pz);
    }
}

int querry (int pz) {
    int rz = 0;
    while (pz > 0) {
        rz += s[pz];
        pz -= len(pz);
    }
    return rz;
}

int main() {

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

    int m, i, a, b, rz, pas, op;

    scanf ("%d%d", &n, &m);
    for (i = 1; i <= n; i++) {
        scanf ("%d", &v[i]);
        update(i, v[i]);
    }

    for (i = 1; i <= m; i++) {
        scanf ("%d", &op);

        if (op == 0) {
            scanf ("%d%d", &a, &b);
            update(a, b);
        }

        if (op == 1) {
            scanf ("%d%d", &a, &b);
            rz = querry(b) - querry(a - 1);
            printf("%d\n", rz);
        }

        if (op == 2) {
            scanf ("%d", &a);
            pas = (1 << 20);
            rz = 0;
            while (pas > 0) {
                if (rz + pas <= n && s[rz + pas] <= a) {
                    rz += pas;
                    a -= s[rz];
                }
                pas /= 2;
            }

            if (a == 0 && rz > 0)
                printf ("%d\n", rz);
            else
                printf ("-1\n");
        }
    }

    return 0;
}