Cod sursa(job #1360089)

Utilizator T.C.11Tolan Cristian T.C.11 Data 25 februarie 2015 11:31:24
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,i,j,v[100001],s[100001],x,a,b;

void actualizare(int poz)
{
    int k=poz;
    while (poz<=n)
    {
        s[poz]+=v[k];
        poz+=poz&-poz;
    }
}

void modificare(int poz, int val)
{
    while (poz<=n)
    {
        s[poz]+=val;
        poz+=poz&-poz;
    }
}

int sumaval(int poz1,int poz2)
{
    int suma=0;
    poz1--;
    while (poz2!=0)
    {
        suma+=s[poz2];
        poz2-=poz2&-poz2;
    }
    while (poz1!=0)
    {
        suma-=s[poz1];
        poz1-=poz1&-poz1;
    }
    return suma;
}

int cautare_binara(int x)
{
    int cs=1;
    int cd=n;
    int mij;
    while (cs<cd)
    {
        if (mij==(cs+cd)/2)
            break;
        mij=(cs+cd)/2;
        if (sumaval(1,mij)>x)
            cd=mij;
        else if (sumaval(1,mij)<x)
            cs=mij;
        else
            return mij;
    }
    if (sumaval(1,cs)==x)
        return cs;
    else
        return cd;
}

int main()
{
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>v[i];
    for (i=1;i<=n;i++)
        actualizare(i);
    for (i=1;i<=m;i++)
    {
        fin>>x;
        switch(x)
        {
            case 0:
            fin>>a>>b;
            modificare(a,b);
            break;
            case 1:
            fin>>a>>b;
            fout<<sumaval(a,b)<<"\n";
            break;
            case 2:
            fin>>a;
            fout<<cautare_binara(a)<<"\n";
            break;
            default:

            break;
        }
    }
    return 0;
}