Cod sursa(job #3256431)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 14 noiembrie 2024 16:24:54
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define NMAX 100002
using namespace std;
ifstream  fin("aib.in");
ofstream fout("aib.out");
int N,M,x,aib[NMAX];

void update(int nod, int val)
{
    for(int i=nod; i<=N; i+=(i&(-i)))
    {
        aib[i]+=val;
    }
}

long long query(int nod)
{
    long long s=0;

    for(int i=nod; i>0; i-=(i&(-i)))
    {
        s+=aib[i];
    }

    return s;
}

int cautare(int sum)
{
    int poz,p1,p2,pmijl;
    long long s;

    poz=-1;
    p1=1;
    p2=N;

    while(p1<=p2)
    {
        pmijl=(p1+p2)/2;
        s=query(pmijl);

        if(s==sum)
        {
            poz=pmijl;
            p2=pmijl-1;
        }
        else
        {
            if(s>sum)
            {
                p2=pmijl-1;
            }
            else
            {
                p1=pmijl+1;
            }
        }
    }

    return poz;
}

void citire()
{
    fin>>N>>M;

    for(int i=1; i<=N; i++)
    {
        fin>>x;
        update(i,x);
    }
}

int main()
{
    int op,a,b;
    citire();

    for(int i=1; i<=M; i++)
    {
        fin>>op;

        if(op==0)
        {
            fin>>a>>b;
            update(a,b);
        }

        if(op==1)
        {
            fin>>a>>b;
            fout << query(b)-query(a-1) << "\n";
        }

        if(op==2)
        {
            fin>>a;
            fout<< cautare(a) << "\n";
        }
    }

    return 0;
}