Cod sursa(job #2415060)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 25 aprilie 2019 14:58:25
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

#define Nmax 100000
#define lsb(x) (x&(-x))

using namespace std;

int N, Q;

int AIB[Nmax + 5];

inline void update (int poz, int val);
inline int query (int poz);
inline int binarySearch (int val);

int main()
{
    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);
    scanf ("%d %d", &N, &Q);
    for (int i = 1; i <= N; ++i)
    {
        int x;
        scanf ("%d", &x);
        update (i, x);
    }
    while (Q--)
    {
        int TASK;
        scanf ("%d", &TASK);
        if (TASK == 0)
        {
            int val, poz;
            scanf ("%d %d", &poz, &val);
            update (poz, val);
        }
        if (TASK == 1)
        {
            int lo, ri;
            scanf ("%d %d", &lo, &ri);
            printf ("%d\n", query (ri) - query (lo - 1));
        }
        if (TASK == 2)
        {
            int sum;
            scanf ("%d", &sum);
            printf ("%d\n", binarySearch (sum));
        }
    }
    return 0;
}

inline void update (int poz, int val)
{
    while (poz <= N)
    {
        AIB[poz] += val;
        poz += lsb (poz);
    }
}

inline int query (int poz)
{
    int sum = 0;
    while (poz)
    {
        sum += AIB[poz];
        poz -= lsb (poz);
    }
    return sum;
}

inline int binarySearch (int sum)
{
    int left = 1, right = N, mid = 0;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (AIB[mid] > sum)
            right = mid - 1;
        else if (AIB[mid] < sum)
                left = mid + 1;
            else return mid;
    }
    return -1;
}