Cod sursa(job #2718904)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 9 martie 2021 12:42:10
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda no-time-to-rest Marime 0.97 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,last=0,step;

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

 while( step )
 {
  if( last+step<=n )
  {
    if( sum>=aux+aib[last+step] ){
     aux=aib[last+step];
     last+=step;
    }
  }
  step/=2;
 }
 if( aux==sum ) return last;
 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';
  }

 }
}