Cod sursa(job #1482761)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 7 septembrie 2015 21:32:34
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is("aib.in");
ofstream os("aib.out");

typedef vector<int> VI;

int n, m;
VI s;

void Read();
void Update(int poz, int val);
int Sum(int poz);
int BS(int val);

int main()
{
    Read();
    int tip, a, b;
    while ( m-- )
    {
        is >> tip >> a;
        if ( tip != 2 )
        {
            is >> b;
            if ( !tip )
            {
                Update(a, b);
            }
            else
                os << Sum(b) - Sum(a - 1) << "\n";
        }
        else
            os << BS(a) << "\n";

    }
    is.close();
    os.close();
    return 0;
}

int BS(int val)
{
    int st = 1, dr = n, md, sum;
    do
    {
        md = ( st + dr ) / 2;
        sum = Sum(md);
        if ( sum == val)
            return md;
        else
            if ( sum > val )
                dr = md - 1;
            else
                st = md + 1;
    } while ( st <= dr );
    return md;
}

int Sum(int poz)
{
    int q = 0;
    for ( int i = poz; i; i -= i & -i )
        q += s[i];
    return q;
}

void Update(int poz, int val)
{
    for ( int i = poz; i <= n; i += i & -i )
        s[i] += val;
}

void Read()
{
    is >> n >> m;
    int a;
    s = VI(n + 1);
    for ( int i = 1; i <= n; ++i )
    {
        is >> a;
        Update(i, a);
    }
}