Cod sursa(job #2422863)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 20 mai 2019 09:18:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#define nrz(x) ((x^(x-1))&x)
#define Nmax 100005

using namespace std;

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

int n, m, a, b;
int aib[Nmax];

void update(int pos, int val, int n)
{
    while (pos <= n)
    {
        aib[pos]+=val;
        pos+=nrz(pos);
    }
}

int query(int pos)
{
    int val = 0;
    while (pos > 0)
    {
        val+=aib[pos];
        pos-=nrz(pos);
    }
    return val;
}

int binSearch(int sum, int n)
{
    int dr=n, st=1;
    while (st <= dr)
    {
        int md = (st + dr) / 2, k = query(md);
        if (k == sum) return md;
        else
        {
            if (k > sum) dr = md - 1;
            else st = md + 1;
        }
    }
    return -1;
}

int main()
{
    f >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        f >> a;
        update(i, a, n);
    }

    for (int i = 1; i <= m; i++)
    {
        f >> a;
        if (a == 0)
        {
            f >> a >> b;
            update(a, b, n);
        }
        else if (a == 1)
        {
            f >> a >> b;
            g << query(b) - query(a-1) << '\n';
        }
        else
        {
            f >> a;
            g << binSearch(a, n) << '\n';
        }
    }
    return 0;
}