Cod sursa(job #3270811)

Utilizator wiki__Andrei Alecu izsak wiki__ Data 24 ianuarie 2025 15:33:17
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <set>
#include <vector>
using namespace std;

ifstream cin("aib.in");
ofstream cout("aib.out");

struct AIB {

    vector<int> aib;
    int n;

    AIB(int size) {

        n = size;
        aib.resize(n+1);

    }

    void add(int x,int i) {

        while (i <= n) {
            aib[i] += x;
            i += i & -i;
        }

    }

    int query(int i) {

        int sum = 0;

        while (i > 0) {
            sum += aib[i];
            i -= i & -i;
        }

        return sum;

    }

    int rangesum(int i1,int i2) {

        return query(i2) - query(i1-1);

    }


};

int main() {

    int n,q;
    cin>>n>>q;

    AIB aib = AIB(n);

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

        int x;
        cin>>x;

        aib.add(x,i);

    }

    for (int i=0; i<q; i++) {

        int c,a,b;

        cin>>c;

        if (c == 0) {
            cin>>a>>b;

            aib.add(b,a);

        }

        if (c == 1) {

            cin>>a>>b;

            cout<<aib.rangesum(a,b)<<"\n";

        }

        if (c == 2) {

            cin>>a;

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

                if (aib.query(i) == a) {
                    cout<<i<<"\n";
                    break;
                }

            }

        }

    }

}