Cod sursa(job #1138186)

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

#define NMax 100001

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

int n,m;
int v[NMax],id[NMax];

void index(int x)
{
    int nr=1;
    while((x&nr)==0) nr=(nr<<1);
    id[x]=nr;
}

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

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

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

    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        index(i);
        f>>v[i];
        v[i]+=sum(i-1)-sum(i-id[i]);
    }

    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;
            for(b=1;b<=n;b++)
                if(sum(b)==a) {g<<b<<"\n";break;}
        }
    }

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