Cod sursa(job #1622585)

Utilizator PetrutiuPaulPetrutiu Paul Gabriel PetrutiuPaul Data 1 martie 2016 12:30:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int aib[100005], n, m;

void Up (int pos, int value)
{
    while (pos <= n)
    {
        aib[pos] += value;
        pos += (pos&(-pos));
    }
}

int Query (int pos)
{
    int s = 0;
    while (pos > 0)
    {
        s += aib[pos];
        pos -= (pos&(-pos));
    }
    return s;
}

int Position (int value)
{
    int left = 1, right = n, index = -1;
    while (left <= right)
    {
        int middle = (left + right) / 2;
        int sum = Query(middle);
        if (sum == value)
        {
            index = middle;
            right = middle - 1;
        }
        if (sum > value)
            right = middle - 1;
        else
            left = middle + 1;
    }
    return index;
}

int main()
{
    fin >>n >>m;

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

    for (int i = 1; i <= m; ++i)
    {
        int cod, x, y;
        fin >>cod;

        if (cod == 0)
        {
            fin >>x >>y;
            Up(x, y);
        }

        if (cod == 1)
        {
            fin >>x >>y;
            fout <<Query(y) - Query(x-1) <<'\n';
        }

        if (cod == 2)
        {
            fin >>x;
            fout <<Position(x) <<'\n';
        }

    }

    return 0;
}