Cod sursa(job #2444004)

Utilizator alexoloieriAlexandru Oloieri alexoloieri Data 29 iulie 2019 23:47:37
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;

class fenwickTree
{
private:
#define uint unsigned int
#define lsb(x) (x)&(-x)
#define swp(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
#define BIT_CHECK_CREATED(ret) if (!created) return ret
#define BIT_ERROR 2147483647
    int *tree;
    bool created;
    uint n;
    void updatee(uint poz, int add)
    {
        for (;poz<=n;poz+=lsb(poz))
            tree[poz]+=add;
    }
    int queryy(uint poz)
    {
        int ret=0;
        for (;poz;poz-=lsb(poz))
            ret+=tree[poz];
        return ret;
    }
public:
    fenwickTree():tree(nullptr), created(false) {}
    bool create(uint sz)
    {
        if (created) return false;
        tree = new int[sz + 2];
        if (tree == nullptr) return false;
        n = sz + 2;
        for (uint i=0;i<n;++i) tree[i] = 0;
        created = true;
        return true;
    }
    bool update(uint poz, int add)
    {
        BIT_CHECK_CREATED(false);
        if (poz >= n) return false;
        updatee(poz, add);
        return true;
    }
    int query(uint poz)
    {
        BIT_CHECK_CREATED(BIT_ERROR);
        if (poz >= n) return BIT_ERROR;
        return queryy(poz);
    }
    int query(uint left, uint right)
    {
        BIT_CHECK_CREATED(BIT_ERROR);
        if (left > right) swp(left, right);
        if (right >= n) return BIT_ERROR;
        return queryy(right) - queryy(left-1);
    }
};
int n, m, t, x, y;
int op3(int val, fenwickTree *tree)
{
    int st = 1, dr = n, mid, v;
    while (st<=dr)
    {
        mid = (st + dr)/2;
        v = tree->query(mid);
        if (v == val) return mid;
        if (v > val) dr = mid-1;
        else st = mid+1;
    }
    return -1;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&m);
    fenwickTree tree;
    tree.create(n);
    for (int i=1;i<=n;++i)
    {
        scanf("%d",&x);
        tree.update(i,x);
    }
    for (int i=1;i<=m;++i)
    {
        scanf("%d %d",&t,&x);
        if (t == 0) {scanf("%d",&y); tree.update(x,y);}
        else if (t == 1) {scanf("%d",&y); printf("%d\n", tree.query(x,y));}
        else printf("%d\n", op3(x, &tree));
    }
    return 0;
}