Cod sursa(job #2023429)

Utilizator Cristi_ChiraChira Cristian Cristi_Chira Data 18 septembrie 2017 22:12:32
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#define lsb(x) (x&(-x))
#define DM 100005

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, aib[DM];
void adg( int sant, int value )
{
    for( int i = sant; i <= n; i += lsb(i))
    {
        aib[i] += value;
    }

}
int interval( int d )
{
    int result = 0;
    for( int i = d; i > 0; i -= lsb(i))
    {
        result += aib[i];
    }
    return result;
}
int cb( int suma )
{
    int left = 0, right = n + 1, mid;
    while( right - left > 1)
    {
        mid = (left + right)/2;
        if(interval( mid ) <= suma) left = mid;
        else right = mid;
    }
    if( left == n + 1 || interval( left ) != suma || !left)
        return -1;
    return left;

}
int a, b;
int main()
{
    int ax;
    fin >> n >> m;
    for( int i = 1 ; i <= n; i++)
        fin >> ax, adg( i, ax );
    for( int i = 1; i <= m; i++)
    {
        fin >> ax;
        if( ax == 0 )
        {
            fin >> a >> b;
            adg(a, b);

        }
        else if( ax == 1)
        {
            fin >> a >> b;
            fout << interval(b) - interval(a - 1)<<"\n";
        }
        else
        {
            fin >> a;
            fout << cb(a) << "\n";
        }
    }
    return 0;
}