Cod sursa(job #2718918)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 9 martie 2021 12:52:24
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda no-time-to-rest Marime 1.05 kb
#include <bits/stdc++.h>

#define zeros(x) ((x^(x-1))&x)

using namespace std;

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

int n,v[100005],q,aib[100005];

void ad(int poz,int x)
{
 for(int i=poz;i<=n;i+=zeros(i))
 {
  aib[i]+=x;
 }
}

int sum(int poz)
{
 int sol=0;

 for(int i=poz;i>=1;i-=zeros(i))
  sol+=aib[i];
 return sol;
}

int solve(int sum)
{
 int aux=0,step;

 for ( step = 1; step < n; step <<= 1 );

for ( int i = 0; step; step >>= 1 )
    {
        if ( i + step <= n )
        {
            if ( sum >= aib[i + step] )
            {
                i += step;
                sum -= aib[i];

                if ( !sum ) return i;
            }
        }
    }

 return -1;
}

int main()
{
 f>>n>>q;
 for(int i=1;i<=n;i++){
    f>>v[i];
    ad(i,v[i]);
 }

 for(int i=1;i<=q;i++)
 {
  int tip,a,b;

  f>>tip;

  if(tip==0)
  {
    f>>a>>b;
    ad(a,b);
  }
  if(tip==1)
  {
    f>>a>>b;
    g<<sum(b)-sum(a-1)<<'\n';
  }
  if(tip==2)
  {
    f>>a;
    g<<solve(a)<<'\n';
  }

 }
}