Cod sursa(job #2819553)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 18 decembrie 2021 16:30:53
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

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

const int MAXN = 100000;
const int MAXL = 17;

int ultimulBitSem( int x ){
  return x & ( -1 * x );
}

int aib[MAXN + 1];

void built( int n ){
  int i;

  for( i = 1; i <= n; i++ ){

    //out<<"functie: ";
    if( i + ultimulBitSem(i) <= n )
      aib[i + ultimulBitSem(i)] += aib[i];
    //out<<i<<" "<<aib[i]<<" "<<" "<<i + ultimulBitSem(i)<<" "<<aib[i + ultimulBitSem(i)]<<'\n';
  }
}

int query(int x){
  int sum;

  sum = 0;
  while(x){
    sum += aib[x];
    x -= ultimulBitSem(x);
  }

  return sum;
}

void update(int pos, int val, int n){
  while( pos <= n ){
    aib[pos] += val;
    pos += ultimulBitSem(pos);
    //cout<<pos<<'\n';
  }
}

int cautPos( int val, int n ){
  bool ok;
  int sum, step, pos;

  step = 1 << MAXL;
  pos = 0;
  sum = 0;
  ok = 0;

  while( step ){
    if( step + pos <= n && sum + aib[step + pos] <= val ){
      pos += step;
      sum += aib[pos];
      ok = 1;
    }

    step /= 2;
  }

  if( sum == val && ok == 1 )
    return pos;
  return -1;
}

int main(){
  int n, m, c, a, b, i;
  in>>n>>m;
  for( i = 1; i <= n; i++ ){
    in>>aib[i];
  }
  built(n);

  for( i = 0; i < m; i++ ){
    in>>c>>a;
    if( c == 0 ){
      in>>b;
      update(a, b, n);
      //cout<<"am trecut"<<'\n';
    }
    if( c == 1 ){
      in>>b;
      //out<<"cerinta 1: "<<a<<" "<<b<<'\n';
      //out<<query(b)<<" "<<query(a - 1)<<'\n';
      out<<query(b) - query(a - 1)<<'\n';
    }
    if( c == 2 )
      out<<cautPos(a, n)<<'\n';
  }
  return 0;
}