Cod sursa(job #2907392)

Utilizator maiaauUngureanu Maia maiaau Data 30 mai 2022 01:09:14
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;

int c, n, m, i, aux, x, y;
int a[100001], z[100001];

void zero();
void update(int, int);
int query(int);
int q(int);

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    
    scanf("%d%d", &n, &m);
    zero();
    for (i = 1; i <= n; i++){
        scanf("%d", &aux);
        update(i, aux);
    }
    for (; m; m--){
        scanf("%d", &c);
        switch(c)
        {
        case 0:
            scanf("%d%d", &x, &y);
            update(x, y);
            break;
        case 1:
            scanf("%d%d", &x, &y);
            printf("%d\n", query(y) - query(x - 1));
            break;
        default:
            scanf("%d", &x);
            printf("%d\n", q(x));
        }
    }
    
    return 0;
}

void zero(){
    for (i = 1; i <= n; i++) 
        z[i] = (1 << __builtin_ctz(i));
}
void update(int p, int v){
    for (int i = p; i <= n; i += z[i]) 
        a[i] += v;
}
int query(int p){
    int s = 0;
    for (int i = p; i > 0; i -= z[i]) s += a[i];
    return s;
}
int q(int v){
    for (int k = 1; k <= n; k <<= 1){
        if(a[k] == v) return k;
    }
    return -1;
}