Cod sursa(job #1138190)

Utilizator ThomasFMI Suditu Thomas Thomas Data 9 martie 2014 18:36:49
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
using namespace std;

#define NMax 100001

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

int n,m;
int v[NMax];

int index(int x)
{
    int nr=1;
    while((x&nr)==0) nr=(nr<<1);
    return nr;
}

int sum(int poz)
{
    int s=0;
    while(poz>0)
    {
        s+=v[poz];
        poz-=index(poz);
    }
    return s;
}

void add(int poz,int val)
{
    while(poz<=n)
    {
        v[poz]+=val;
        poz+=index(poz);
    }
}

int bsearch(int val,int st,int dr)
{
    if(st>dr) return 0;

    int mij=(st+dr)/2;
    int s=sum(mij);

    if(s==val) return mij;
    else if(s>val) bsearch(val,st,mij);
    else bsearch(val,mij+1,dr);
}

int main()
{
    int i,p,a,b;

    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>a;
        add(i,a);
    }

    for(i=1;i<=m;i++)
    {
        f>>p;
        if(p==0)
        {
            f>>a>>b;
            add(a,b);
        }
        else if(p==1)
        {
            f>>a>>b;
            g<<sum(b)-sum(a-1)<<"\n";
        }
        else
        {
            f>>a;
            g<<bsearch(a,1,n)<<"\n";
        }
    }

    f.close();
    g.close();
    return 0;
}