Cod sursa(job #2428708)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 6 iunie 2019 09:16:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>

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

int n,m;
int bit[100500];
int v[100500];

int getParent(int a)
{
  return a-(a&(-a));
}

long long getSum(int a)
{
  if(a>0)
    return bit[a]+ getSum(getParent(a));
  return bit[a];
}
void addP(int a, int b)
{
  int pos = a;
  while(pos<=n)
  {
    bit[pos]+=b;
    pos+=pos&(-pos);
  }
}

int findK(int k)
{
  long long pos;
  for(pos=1;pos<n;pos<<=1);
  if(pos>n) pos>>=1;
  for(int i=0;pos>0;pos>>=1)
  {
    if(i+pos<=n)
    {
      if(bit[i+pos]<=k)
      {
        i+=pos;
        k-=bit[i];
        if(k==0) return i;
      }
    }
  }
  return -1;
}

int main()
{
  fin>>n>>m;
  for(int i=0;i<n;i++)
  {
    fin>>v[i];
    addP(i+1,v[i]);
  }
  for(int i=0;i<m;i++)
  {
    int p;
    fin>>p;
    if(p==0)
    {
      int a,b;
      fin>>a>>b;
      addP(a,b);
    }
    else if(p==1)
    {
      int a,b;
      fin>>a>>b;
      fout<< getSum(b)-getSum(a-1)<<"\n";
    }
    else
    {
      int a;
      fin>>a;
      fout<<findK(a)<<"\n";
    }
  }
}