Cod sursa(job #2251691)

Utilizator roberttrutaTruta Robert roberttruta Data 1 octombrie 2018 20:55:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>

using namespace std;
int n,i,m,A,p,s,d,k,j,a,b,x,s1,s2,v[100005],aib[100005];

void add (int a, int b)
{
     while(a<=n)
    {
        aib[a]+=b;
        a=a+(a-(a&(a-1)));
    }
}
void suma (int a)
{
    while(a)
    {
        s1+=aib[a];
        a&=a-1;
    }
}
int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");

    f>>n>>m;
    for(i=1;i<=n;i++)
    f>>v[i];
///Formam aib: aib[i]=suma ultimilor X nr , unde X=2^max din descompunerea lui i.
    for(i=1;i<=n;i++)
    {
        k=i&(i-1);
    for(j=i;j>k;j--)
        aib[i]+=v[j];
    }

    for(i=1;i<=m;i++)
    {
        f>>x;
        if(x==0)
        {
            f>>a>>b;
            add(a,b);
        }
        if(x==1)
        {
            f>>a>>b;
            a--; s1=0;
            suma(a);
            s2=s1; s1=0;
            suma(b);
            g<<s1-s2<<'\n';
        }
        if(x==2)
        {
            f>>A;
            s=1; d=n;
            while(s<=d)
            {
                p=(s+d)/2;
                s1=0;
                suma(p);
                if(s1<A)
                s=p+1;
                else
                d=p-1;
            }
            if(s1==A)
                g<<p<<'\n';
            else
            {
                p++;
                s1=0;
                suma(p);
                if(s1==A)
                    g<<p<<'\n';
                else
                g<<-1<<'\n';
            }

        }
    }


    return 0;
}