Cod sursa(job #1762567)

Utilizator dumitrescugeorgeGeorge Dumitrescu dumitrescugeorge Data 23 septembrie 2016 19:21:39
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,aib[100050],p,x,y;
int zero(int x)
{
    return ((x-1)^x)&x;
}
void creare(int i)
{
    int o=zero(i);
    int j=i;
    while(o<=n)
        {
            aib[j]+=x;
            j+=o;
            o=zero(j);
        }
}
void inserare(int x,int y)
{
    int o=zero(x);
    int j=x;
    while(o<=n)
        {
            aib[j]+=y;
            j+=o;
            o=zero(j);
        }
}
int suma(int a)
{
    int o=((a-1)^a)&a;
    if(o>=a||a==1)
        return aib[a];
    return aib[a]+suma(a-o);
}
int binar(int a)
{
    int st=1,dr=n,mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        int sum=suma(mij);
        if(sum==a)
            return mij;

        if(sum>a)
            dr=mij-1;

        else
            st=mij+1;

    }
    return -1;
}
int cerinta1(int a,int b)
{
    return suma(b)-suma(a-1);
}
void citire()
{
    scanf("%d",&n);
    scanf("%d",&m);
    for(int i=1;i<=n;i++)
       {
           scanf("%d",&x);
           creare(i);
       }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&p);
        if(p==2)
            {
                scanf("%d",&x);
                printf("%d\n",binar(x));
            }
        else
            {
                scanf("%d%d",&x,&y);
                if(p==1)
               {
                   if(x==y)
                    printf("%d\n",suma(x)-suma(x-1));
                   else
                   {
                    printf("%d\n",cerinta1(x,y));
                   }
               }
               else
                    inserare(x,y);
            }
    }
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    citire();
    //cout << "Hello world!" << endl;
    return 0;
}