Cod sursa(job #1519290)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 7 noiembrie 2015 09:24:07
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n;
int aib[100010];

inline void add (int poz, int x)
{
    for (int i = poz; i <= n; i += i & (-i))
        aib[i] += x;
}

inline int querry (int poz)
{
    int rez = 0;
    for (int i = poz; i; i -= i & (-i))
        rez += aib[i];

    return rez;
}

inline int cb (int x)
{
    int a = 1, b = n, mi = -1;
    while (a <= b)
    {
        int mid = (a + b) >> 1;
        int sum = querry (mid);

        if (sum == x)
        {
            mi = mid;
            b = mid - 1;
        }

        else if (sum > x) b = mid - 1;
        else a = mid + 1;
    }

    return mi;
}

int main ()
{
    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);

    int m;
    scanf ("%d %d", &n, &m);

    for (int i = 1; i <= n; ++i)
    {
        int x;
        scanf ("%d", &x);
        add (i, x);
    }

    for (int i = 1; i <= m; ++i)
    {
        int op, a;
        scanf ("%d %d", &op, &a);

        if (!op)
        {
            int b;
            scanf ("%d", &b);
            add (a, b);
        }

        else if (op == 1)
        {
            int b;
            scanf ("%d", &b);

            printf ("%d\n", querry (b) - querry (a - 1));
        }

        else
            printf ("%d\n", cb (a));
    }

    return 0;
}