Cod sursa(job #1248830)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 26 octombrie 2014 02:13:53
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
using namespace std;

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

int n, m, x, y, z;
int c[100001];
int st, dr, md, ss;

void ADD(int a, int b);
int SUM(int a);

int main()
{
    is >> n >> m;
    for ( int i = 1; i <= n; ++i )
    {
        is >> x;
        ADD(i, x);
    }
    while ( m-- )
    {
        is >> x >> y;
        if ( x < 2 )
        {
            is >> z;
            if ( x )
                os << SUM(z) - SUM(y - 1) << "\n";
            else
                ADD(y, z);
        }
        else
        {
            for ( int i = 1; i <= n + 1; ++i )
            {
                ss = SUM(i);
                if ( ss == y )
                {
                    os << i << "\n";
                    i = n + 2;
                }
                if ( i == n + 1 )
                    os << "-1\n";
            }
            /*st = 1, dr = n;
            do
            {
                md = ( st + dr ) / 2;
                ss = SUM(md);
                if ( ss == y )
                {
                    os << md << "\n";
                    st = dr + 1;
                }
                else
                    if ( ss > y )
                        dr = md - 1;
                    else
                        st = md + 1;
            } while ( st <= dr );*/
        }
    }
    is.close();
    os.close();
    return 0;
}

void ADD(int a, int b)
{
    for ( int i = a; i <= n; i += i & -i )
        c[i] += b;
}

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