Cod sursa(job #2781903)

Utilizator Ionut10Floristean Ioan Ionut10 Data 10 octombrie 2021 21:14:10
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define DimMax 100000

using namespace std;

ifstream fin ( "aib.in" );
ofstream fout ( "aib.out" );

int n, m;
int v[DimMax + 1];
int aib[DimMax + 1];
int tip, a, b;

int query ( int k )
{
    int ans = 0;
    while ( k > 0 )
    {
        ans += aib[k];
        k -= k&-k;
    }
    return ans;
}

void update ( int k, int val )
{
    while ( k <= n )
    {
        aib[k] += val;
        k += k&-k;
    }
}

int CautaBinar ( int s )
{
    int sol = -1;
    int st = 1; int dr = n;
    while ( st <= dr )
    {
        int mij = (st + dr) / 2;
        if ( query(mij) >= s )
        {
            sol = mij;
            dr = mij - 1;
        } else st = mij + 1;
    }
    if ( query(sol) == s ) return sol;
    else return -1;
}

int main()
{
    fin >> n >> m;
    for ( int i = 1; i <= n; i++ )
    {
        fin >> v[i];
        update(i, v[i]);
    }
    for ( int i = 1; i <= m; i++ )
    {
        fin >> tip;
        if ( tip == 0 )
        {
            fin >> a >> b;
            update(a, b);
        }
        else if ( tip == 1 )
        {
            fin >> a >> b;
            fout << query(b) - query(a - 1) << '\n';
        }
        else
        {
            fin >> a;
            fout << CautaBinar(a) << '\n';
        }
    }
    return 0;
}