Cod sursa(job #2906318)

Utilizator mihnea.tTudor Mihnea mihnea.t Data 25 mai 2022 17:11:58
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

#define NMAX ((int)1e5)
#define COMM_UPDATE 0
#define COMM_SUM_QUERY 1
#define COMM_MIN_INDEX 2

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int tree[NMAX + 1];
int v[NMAX + 1];

void update(int index, const int new_val, const int n_max) {
    while (index <= n_max) {
        tree[index] += new_val;
        index += (index & -index);
    }
}

int get_val(int index) {
    int val = 0;
    while (index > 0) {
        val += tree[index];
        index -= (index & -index);
    }

    return val;
}
 
int binary_search(int n, int value)
{
    int step = 1;
    for (; step < n; step <<= 1); 
    
    for(int i = 0; step; step >>= 1) {
         if(i + step <= n) {
            if(value >= tree[i + step]) {
                i += step;
                value -= tree[i];

                if (value == 0) {
                    return i;
                }
            }
         }
    }
    
    return -1;
}

int main(void) {
    int n, m;
    fin >> n >> m;

    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
        update(i, v[i], n);
    }

    for (int i = 0; i < m; ++i) {
        int type;
        fin >> type;

        switch (type) {
            case COMM_UPDATE:
                int pos, val;
                fin >> pos >> val;

                v[pos] += val;
                update(pos, val, n);

                break;
            
            case COMM_SUM_QUERY:
                int left, right;
                fin >> left >> right;

                fout << get_val(right) - get_val(left - 1) << "\n";

                break;
            
            case COMM_MIN_INDEX:
                int sum;
                fin >> sum;

                fout << binary_search(n, sum) << "\n";
        }
    }

    return 0;
}