Cod sursa(job #3173295)

Utilizator pinzaruliviuPinzaru Liviu-Vasile pinzaruliviu Data 22 noiembrie 2023 13:32:44
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include<fstream>
using namespace std;
const unsigned int dim=100002;
#define z(x) (x&(-x))
ifstream f("aib.in");
ofstream g("aib.out");

unsigned int n;
unsigned int A[dim];

void upd(unsigned int ind, unsigned int v)
{
    for(unsigned int i=ind; i<=n; i+=z(i))
    {
        A[i]+=v;
    }
}

unsigned int sum(unsigned int ind)
{
    unsigned int s=0;
    for(unsigned int i=ind; i>0; i-=z(i))
    {
        s+=A[i];
    }
    return s;
}

int main()
{
    unsigned int i,j,x,a,b,q,m;
    int k;
    unsigned int st,dr,mij;

    f>>n>>m;

    for(i=1; i<=n; i++)
    {
        f>>x;
        upd(i,x);
    }

    while(m--)
    {
        f>>q;

        if(q==0)
        {
            f>>a>>b;
            upd(a,b);
        }
        else if(q==1)
        {
            f>>a>>b;
            unsigned int s=sum(b)-sum(a-1);
            g<<s<<'\n';
        }
        else if(q==2)
        {
            f>>a;
            k=-1;
            st=1;
            dr=n;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                x=sum(mij);
                if(a==x)
                {
                    k=mij;
                    dr=mij-1;
                }
                else if(a<x)
                {
                    dr=mij-1;
                }
                else if(a>x)
                {
                    st=mij+1;
                }

            }
            g<<k<<'\n';
        }
    }

    return 0;
}