Cod sursa(job #2327026)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 24 ianuarie 2019 12:42:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int N, M;
int a[NMAX];
int tree[NMAX];

void Update( int index, int val )
{
  while( index <= N )
  {
    tree[index] += val;
    index += ( index & -index );
  }
}

int Query( int lf, int rg )
{
  int ans = 0;

  while( rg > 0 )
  {
    ans += tree[rg];
    rg -= ( rg & -rg );
  }

  --lf;

  int ans2 = 0;

  while( lf > 0 )
  {
    ans2 += tree[lf];
    lf -= ( lf & -lf );
  }

  //fout << ans << ' ' << ans2 << '\n';

  return ans - ans2;
}

void Read()
{
  fin >> N >> M;

  for( int i = 1; i <= N; ++i )
  { fin >> a[i];
    Update( i, a[i] );
  }

  int tip, a, b;

  for( int i = 1; i <= M; ++i )
  {
    fin >> tip;

    if( tip == 0 )
    {
     fin >> a >> b;

     Update( a, b );
    }

    if( tip == 1 )
    {
      fin >> a >> b;

      fout << Query( a, b ) << '\n';
    }

    if( tip == 2 )
    {
      fin >> a;

      int lf = 1, rg = N, mid, res, ans;
      bool found = false;

      while( !found && lf <= rg )
      {
        mid = ( lf + rg ) / 2;
        res = Query( 1, mid );

        if( res == a )
        {
          ans = mid;
          found = true;
        }
        else
          if( res > a ) rg = mid - 1;
          else lf = mid + 1;
      }

      if( found ) fout << ans << '\n';
      else fout << "-1\n";
    }
  }
}

int main()
{
    Read();

    return 0;
}