Cod sursa(job #2819552)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 18 decembrie 2021 16:18:37
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 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 v[MAXN + 1];
int aib[MAXN + 1];

void built( int n ){
  int i;

  for( i = 1; i <= n; i++ ){
    aib[i] += v[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 ){
  int sum, step, pos;

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

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

    step /= 2;
  }

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

int main(){
  int n, m, c, a, b, i;
  in>>n>>m;
  for( i = 1; i <= n; i++ )
    in>>v[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;
}