Cod sursa(job #1589899)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 4 februarie 2016 15:50:33
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;

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

using VI = vector<int>;
using VVI = vector<VI>;

int n, m;
VI a;

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

int main()
{
    Read();
    int tip, x, y;
    while ( m-- )
    {
        is >> tip >> x;
        if ( tip == 2 )
        {
            int s, st = 1, dr = n, md;
            while ( st <= dr )
            {
                md = ( st + dr ) / 2;
                s = Sum(md);
                if ( s == x )
                    st = dr + 1;
                else
                    if ( s > x )
                        dr = md - 1;
                    else
                        st = md + 1;
            }
            if ( s == x )
                os << md << "\n";
            else
                os << "-1\n";
        }
        else
        {
            is >> y;
            if ( !tip )
                Update(x, y);
            else
                os << Sum(y) - Sum(x - 1) << "\n";
        }
    }
    is.close();
    os.close();
    return 0;
}

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

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

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