Cod sursa(job #1360134)

Utilizator T.C.11Tolan Cristian T.C.11 Data 25 februarie 2015 11:58:00
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

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

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)
    {
        mij=(cs+cd)/2;
        if (sumaval(1,mij)>x)
            cd=mij-1;
        else if (sumaval(1,mij)<x)
            cs=mij+1;
        else if (sumaval(1,mij)==x)
            return mij;
    }
    if (sumaval(1,cs)==x)
        return cs;
    return -1;
}

int main()
{
    fin>>n>>m;
    for (i=1;i<=n;i++)
    {
        fin>>x;
        modificare(i,x);
    }
    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;
}