Cod sursa(job #1996825)

Utilizator robertstrecheStreche Robert robertstreche Data 2 iulie 2017 17:47:30
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>

#define NMAX 100005

using namespace std;

int n;
int sum[NMAX];

inline void update(int pos, int val){

    for (int i = pos; i <= n; i += i & -i)
        sum[i] += val;

    return;
}

inline int query(int pos){

    int s = 0;
    for (int i = pos; i; i -= i & -i)
        s += sum[i];

    return s;
}

inline int bin(int val){

    int left = 1, right = n;

    while (left <= right){

        int middle = (left + right) / 2;
        int value = query(middle);

        if (value == val)
            return middle;

        if (value < val)
            left = middle + 1;
        else
            right = middle - 1;
    }
}

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

    int m, type, x, y;
    f >> n >> m;

    for (int i = 1; i <= n; i++){
        f >> x;
        update(i, x);
    }

    for (; m; m--){

        f >> type;

        if (type == 0){

            f >> x >> y;
            update(x, y);
        }

        if (type == 1){

            f >> x >> y;
            g << query(y) - query(x - 1) << '\n';
        }

        if (type == 2){

            f >> x;
            g << bin(x) << '\n';
        }
    }

    f.close();
    g.close();

    return 0;
}