Cod sursa(job #2947741)

Utilizator vtvtvtvtvtvtvtvt vtvtvtvt Data 26 noiembrie 2022 17:36:19
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define ub(x) (x&(-x))

int aib[100001];

void add(int aib[],int poz,int val,int lun)
{
    for (int i=poz;i<=lun;i+=ub(i))
    {
        aib[i]+=val;
    }
}

int suminit(int aib[],int poz)
{
    int s=0;
    for (int i =poz;i>0;i=i-ub(i))
    {
        s+=aib[i];
    }
    return s;
}

int sum1(int aib[],int pmi, int pma)
{
    int s;
    s=suminit(aib,pma)-suminit(aib,pmi-1);
    return s;
}

int caut2(int aib[],int sum,int lun)
{
    int l=1;
    int r=lun;
    int mid=(r+l)/2;
    while (r>=l)
    {
        mid=(r+l)/2;
        if (suminit(aib,mid)==sum)
        {
            return mid;
        }
        else if (suminit(aib,mid)>sum)
        {
            r=mid-1;
        }
        else
        {
            l=mid+1;
        }
    }
    return 0;
}

int main()
{
    int lun,nrcer;
    in>>lun>>nrcer;
    int nraract;
    for (int i=1;i<=lun;i++)
    {
        in>>nraract;
        add(aib,i,nraract,lun);
    }
    int a,b,ceract;
    while (nrcer--)
    {
        in>>ceract;
        if (ceract==0)
        {
            in>>a>>b;
            add(aib,a,b,lun);
        }
        else if (ceract==1)
        {
            in>>a>>b;
            out << sum1(aib,a,b)<< "\n";
        }
        else if (ceract==2)
        {
            in>>a;
            out << caut2(aib,a,lun) << "\n";
        }
    }
}