Cod sursa(job #2002877)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 21 iulie 2017 08:34:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

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

int arb[400001];
int n, m;

void Adaugare(int indice, int val){
  int pozBit0 = 0;
  while(indice <= n){
    arb[indice] = arb[indice] + val;
    while(!(indice & (1<<pozBit0)))
      pozBit0++;
    indice = indice + (1<<pozBit0);
    pozBit0++;//avem poz zerouri terminale si nu aducem la zero deoarece nr creste in dreapta
  }
}

int Suma(int dr){
  int suma = 0;
  int pozBit0 = 0;
  while(dr > 0){
    suma += arb[dr];
    while(!(dr & (1<<pozBit0)))
      pozBit0++;
    dr = dr - (1<<pozBit0);
    pozBit0++;
  }
  return suma;
}

int cautare(int val){
  int index;
  int pozMinima = 0;
  for(index = 1; index < n; index = index<<1);//numarul care poate fi scris ca putere al lui 2 >= n
  for(pozMinima = 0;index > 0; index = index >>1){
    if(pozMinima + index <= n && val >= arb[pozMinima + index]){
      pozMinima += index;
      val = val - arb[pozMinima];
      if(! val)
        return pozMinima;
    }
  }
  return -1;
}

void citire(){
  in >> n >> m;
  for(int i = 1; i <= n; i++){
    int x;
    in >> x;
    Adaugare(i, x);
  }
  for(int i = 1; i <= m; i++){
    int tip, a, b;
    in >> tip;
    if(tip == 0){
      in >> a >> b;
      Adaugare(a, b);
    }
    else if(tip == 1){
      in >> a >> b;//[a,b] = [1, b] - [1, a)
      out << Suma(b) - Suma(a - 1) << '\n';
    }
    else{
      in >> a;
      out << cautare(a) << '\n';
    }
  }
}

int main(){
  citire();
  return 0;
}