Cod sursa(job #2031054)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 2 octombrie 2017 17:37:31
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <cstdio>
#define p2(x) ((x^(x-1))&x)
using namespace std;
ifstream fi ("aib.in");
ofstream fo ("aib.out");
int aib[100006],v[100006];
int nrel,nrop,op;
void adaug(int pozi,int el)
{
  while (pozi<=nrel)
  {
    aib[pozi]+=el;
    pozi+=p2(pozi);
  }
}
int suma(int x)
{
  if (x==0) return 0;
  return aib[x]+suma(x-p2(x));
}
int pozmin(int pozi,int suma)
{
  if (suma==0) return pozi-1;
  for (int bit=(1<<22);bit>0;bit=(bit>>1)) //
    if (pozi+bit-1<=nrel and aib[pozi+bit-1]<=suma)
      return pozmin(pozi+bit,suma-aib[pozi+bit-1]);
  return -1;
}
int main()
{
  freopen("AIB.in","r",stdin);
  freopen("AIB.out","w",stdout);
  scanf("%d",&nrel);scanf("%d",&nrop);
  for (int i=1;i<=nrel;i++) scanf("%d", &v[i]);
  for (int i=1;i<=nrel;i++) adaug(i,v[i]);
//  for (int i=1;i<=nrel;i++) fo<<aib[i]<<' ';fo<<'\n';
  for (int i=1;i<=nrop;i++)
  {
    scanf("%d",&op);
    if (op==0)
    {
      int p,val;
      scanf("%d",&p);scanf("%d",&val);
      adaug(p,val);
    }
    if (op==1)
    {
      int p1,p2;
      scanf("%d",&p1);scanf("%d",&p2);
      fo<<suma(p2)-suma(p1-1)<<'\n';
    }
    if (op==2)
    {
      int sum;
      scanf("%d",&sum);
      fo<<pozmin(1,sum)<<'\n';
    }
  }
  return 0;
}