Cod sursa(job #2755684)

Utilizator MenelausSontea Vladimir Menelaus Data 27 mai 2021 22:55:15
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>

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

const int N=100000;

int AIB[N+2];

void update(int poz, int dif, int n)
{
    for(int i=poz+1; i<=n+1; i+=(i&-i))
    {
        AIB[i]+=dif;
    }
}

int sum(int poz)
{
    int s=0;

    for(int i=poz+1; i>0; i-=(i&-i))
    {
        s+=AIB[i];
    }

    return s;
}

int interogare(int suma, int n)
{
    int st=1, dr=n, mij, ans=-1;

    do
    {
        mij=(st+dr)/2;
        int temp=sum(mij);

        if(temp<suma)
        {
            st=mij+1;
        }
        else if(temp>suma)
        {
            dr=mij-1;
        }
        else if(temp==suma)
        {
            ans=mij;
            break;
        }
    }
    while(st<=dr);

    return ans;
}

int main()
{
    int n, m, x, l, r, b;

    in>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        in>>x;
        update(i, x, n);
    }

    for(int i=1; i<=m; ++i)
    {
        in>>x;

        if(x==0)
        {
            in>>l>>r;
            update(l, r, n);
            continue;
        }

        if(x==1)
        {
            in>>l>>r;
            out<<sum(r)-sum(l-1)<<"\n";
            continue;
        }

        if(x==2)
        {
            in>>b;
            out<<interogare(b, n)<<"\n";
            continue;
        }
    }

    return 0;
}