Cod sursa(job #2603767)

Utilizator matthriscuMatt . matthriscu Data 20 aprilie 2020 20:28:36
Problema Arbori indexati binar Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#define zeros(x) ((x ^ (x-1)) & x)
using namespace std;

int main() {
    int n, m, c, x, y, i, j, k, s1, s2, aib[100005];

    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; ++i) {
        scanf("%d", &x);
        for(j = i; j <= n; j += zeros(j))
            aib[j] += x;
    }

    for(i = 1; i <= m; ++i) {
        scanf("%d%d", &c, &x);
        if(c == 0) {
            scanf("%d", &y);
            for(j = x; j <= n; j += zeros(j))
                aib[j] += y;
        }

        else if(c == 1) {
            scanf("%d", &y);
            s1 = s2 = 0;
            for(j = y; j > 0; j -= zeros(j))
                s2 += aib[j];
            for(j = x-1; j > 0; j -= zeros(j))
                s1 += aib[j];
            printf("%d\n", s2 - s1);
        }

        else {
            s2 = -1;
            for(j = 1; j <= n; ++j) {
                s1 = 0;
                for(k = j; k > 0; k -= zeros(k))
                    s1 += aib[k];
                if(s1 == x) {
                    s2 = j;
                    break;
                }
            }
            printf("%d\n", s2);
        }
    }
}