Cod sursa(job #1336932)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 8 februarie 2015 14:23:23
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
using namespace std;

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

using VI = vector<int>;

int n, m;
VI a;

void Update(int poz, int val);
int Query(int poz);
void BS(int val);

int main()
{
    int tip, poz, val;
    is >> n >> m;
    a = VI(n + 1);
    for ( int i = 1; i <= n; ++i )
    {
        is >> val;
        Update(i, val);
    }
    int st, dr;
    while ( m-- )
    {
        is >> tip;
        if ( !tip )
        {
            is >> poz >> val;
            Update(poz, val);
        }
        else
            if ( tip == 1 )
            {
                is >> st >> dr;
                os << Query(dr) - Query(st - 1) << "\n";
            }
            else
            {
                is >> val;
                BS(val);
            }
    }
    is.close();
    os.close();
    return 0;
}

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

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

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