Cod sursa(job #1919806)

Utilizator jurjstyleJurj Andrei jurjstyle Data 9 martie 2017 21:07:13
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

using namespace std;

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

int N, M;
int Aib[100002];

void Update(int poz, int val)
{
    for (int i = poz; i <= N; i += i & -i)
        Aib[i] += val;
}
int Query(int poz)
{
    int ans = 0;
    for (int i = poz; i > 0; i -= i & -i)
        ans += Aib[i];
    return ans;
}

int main()
{
    f >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        int val;
        f >> val;
        Update(i, val);
    }
    for (int i = 1; i <= M; ++i)
    {
        int type, a, b;
        f >> type;
        if (type == 0)
        {
            f >> a >> b;
            Update(a, b);
        }
        if (type == 1)
        {
            f >> a >> b;
            g << Query(b) - Query(a - 1) << "\n";
        }
        if (type == 2)
        {
            f >> a;
            int st = 1, dr = N, last_good = -1;
            while (st <= dr)
            {
                int m = (st + dr) >> 1;
                int val = Query(m);
                if (val > a)
                    dr = m - 1;
                else
                {
                    if (val == a)
                        last_good = m;
                    st = m + 1;
                }
            }
            g << last_good << "\n";
        }
    }
    f.close();
    g.close();
    return 0;
}