Cod sursa(job #1760851)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 21 septembrie 2016 13:04:48
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <cstdio>
using namespace std;

int aib[1000],m,n,vCitire[1000];

int nrZerouri(int x)
{
    return x&(x^(x-1));
}

void inserare(int a,int b)
{
    for(int i=a; i<=n; i+=nrZerouri(i))
        aib[i]+=b;
}

int suma(int b)
{
    int rez=0;
    for(int i=b; i>=1; i-=nrZerouri(i))
        rez+=aib[i];
    return rez;
}

void citire()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&vCitire[i]);
        inserare(i,vCitire[i]);
    }
}

int cautK(int y)
{
    int st=1,dr=n;

    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(suma(mij)==y)
        {
            return mij;
        }
        if(suma(mij)<y)
            st=mij+1;
        if(suma(mij)>y)
            dr=mij-1;
    }
    return -1;
}

void afisare()
{
    for(int i=1; i<=n; i++)
        cout<<aib[i]<<" ";
    cout<<endl;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    citire();
    //afisare();
    int x,y,z;
    for(int i=1; i<=m; i++)
    {
        scanf("%d",&x);
        if(x==0)
        {
            scanf("%d%d",&y,&z);
            inserare(y,z);
            //afisare();
        }
        if(x==1)
        {
            scanf("%d%d",&y,&z);
            printf("%d\n",(suma(z)-suma(y-1)));
            //afisare();
        }
        if(x==2)
        {
            scanf("%d",&y);
            printf("%d\n",cautK(y));
            //afisare();
        }

    }
    return 0;
}