Cod sursa(job #2642913)

Utilizator marius004scarlat marius marius004 Data 17 august 2020 18:02:43
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

const int NMAX = 100'001;
int n, queries, tree[NMAX];

void make() {

    for(int i = 1;i <= n;++i) {

        int parent = i + (i & -i);

        if(parent <= n)
            tree[parent] += tree[i];
    }
}

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

int sum(int i) {

    int s = 0;

    while(i > 0) {
        s += tree[i];
        i -= (i & -i);
    }

    return s;
}

int query2(int a) {
    int left = 1;
    int right = n;

    while(left <= right) {
        int mid = (left + right) / 2;

        int s = sum(mid);
        if(s == a)
            return mid;

        if(s < a)
            left = mid + 1;
        else
            right = mid - 1;
    }

    return -1;
}

int main() {

    f >> n >> queries;

    for(int i = 1;i <= n;++i)
        f >> tree[i];

    make();

    while(queries--) {
        int type, a, b;

        f >> type;

        if(type == 0) {

            f >> a >> b;
            update(a, b);

        }else if(type == 1) {
            f >> a >> b;

            if(a > b)
                swap(a, b);

            g << sum(b) - sum(a - 1) << '\n';
        }else {
            f >> a;
            g << query2(a) << '\n';
        }
    }



    return 0;
}