Cod sursa(job #3175973)

Utilizator ioanabaduIoana Badu ioanabadu Data 26 noiembrie 2023 16:31:30
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <iostream>
#define N_MAX 100001
#define N_LOG 18

using namespace std;

int n, m, arr[N_MAX];
int aib[N_MAX];

int leastSignificantBit (int x){
    return x & -x;
}

void build (){
    for (int i=1; i<=n; ++i){
        aib[i] += arr[i];

        if (i + leastSignificantBit(i) <= n)
            aib[i + leastSignificantBit(i)] += aib[i];
    }
}

void update (int idx, int value){
    arr[idx] = value;
    while (idx <= n){
        aib[idx] += value;
        idx += leastSignificantBit(idx);
    }
}

long long query (int Idx){
    long long Sum = 0;

    while (Idx){
        Sum += aib[Idx];
        Idx -= leastSignificantBit(Idx);
    }

    return Sum;
}

int binaryLifting (int value){
    int mask, pos, sum;

    pos = 0;
    sum = 0;
    mask = 1 << N_LOG;

    while (mask){
        if (pos + mask <= n && sum + aib[pos+mask] <= value){
            sum += aib[pos+mask];
            pos += mask;
        }
        mask >>= 1;
    }
    
    if (sum == value)
        return pos;
    return -1;
}

int main (){
    FILE *in, *out;
    in = fopen ("aib.in", "r");
    out = fopen ("aib.out", "w");

    fscanf(in, "%d%d", &n, &m);
    for (int i=1; i<=n; ++i)
        fscanf (in, "%d", &arr[i]);
    
    build();

    int op, x, y;
    for (int i=1; i<=m; ++i){
        fscanf(in, "%d", &op);
        if (op == 0){
            fscanf(in, "%d%d", &x, &y);
            update(x, y);
        }
        else if (op == 1){
            fscanf(in, "%d%d", &x, &y);
            fprintf (out, "%lld \n", query(y) - query(x-1));
        }
        else{
            fscanf(in, "%d", &x);
            fprintf(out, "%d \n", binaryLifting(x));
        }
    }
    return 0;
}