Cod sursa(job #2399010)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 6 aprilie 2019 17:42:42
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>
#define maxn 100000

using namespace std;

int v[maxn+5], aib[maxn+5];
int n;

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

int query ( int p )
{
  int s = 0, p2;
  while (p>0) s += aib[p], p2 = (p&(-p)), p -= p2;
  return s;
}

int src ( int val )
{
  int pas = (1<<30), r = 0;
  for ( ; pas > 0; pas /= 2 )
    if ( r + pas <= n && aib[r+pas] <= val ) r += pas, val -= aib[r];
  if (val == 0) return r;
  else return -1;
}

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

  int m; fin >> n >> m;
  int i, j, z, t, a, b;
  for ( i = 1; i <= n; i++ ) fin >> v[i], update (i, v[i]);

  while (m--)
  {
    fin >> t >> a;
    if ( t == 0 ) fin >> b, update (a, b);
    else if ( t == 1 ) fin >> b, fout << query (b) - query (a-1) << '\n';
    else fout << src (a) << '\n';
  }

  fin.close ();
  fout.close ();

  return 0;
}