Cod sursa(job #1911433)

Utilizator MihalachiRazvanMihalachi Razvan MihalachiRazvan Data 7 martie 2017 20:26:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define zeros(x) ((x^(x-1))&x)
int aib[100001],x,n,v,m,a,b,poz;
void build(int i,int x)
{
    for(int j=i;j<=n;j=j+zeros(j))
        aib[j]=aib[j]+x;
}
int suma(int s)
{
    if(aib[s]==0)
        return 0;
    else
        return aib[s]+suma(s-zeros(s));
}
void divizare(int s,int d,int &m)
{
    m=(s+d)/2;
}
void cautare(int s,int d,int val)
{
    int m;
    if(s<=d)
    {
        divizare(s,d,m);
        if(suma(m)==val)
            poz=m;
        else
            if(val<suma(m))
            cautare(s,m-1,val);
        else
            cautare(m+1,d,val);
    }
}
int main()
{
    fin>>n>>m;
    aib[0]=0;
    for(int i=1;i<=n;i++)
    {fin>>x;
     build(i,x);}
     for(int i=1;i<=m;i++)
     {
       fin>>v;
       if(v==0)
       {
           fin>>a>>b;
           build(a,b);
       }
       else
        if(v==1)
       {
           fin>>a>>b;
           fout<<suma(b)-suma(a-1)<<"\n";
       }
       else
        if(v==2)
       {
         fin>>a;
         poz=0;
         cautare(1,n,a);
         if(poz!=0)
            {
                if(suma(poz-1)==a)
         {
             poz=poz-1;
             while(suma(poz)==a)
                poz=poz-1;
             fout<<poz<<"\n";
         }
         else
            fout<<poz<<"\n";}
            else
                fout<<-1<<"\n";
       }
     }

    return 0;
}