Cod sursa(job #600157)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 30 iunie 2011 17:26:36
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,a[100100],i,c,x,y,p;

void modifica(int p, int val)
{
    while (p<=n)
        a[p]+=val,
        p+=(p ^ (p & (p-1)));
}

int suma(int p)
{
    int t=0;
    while (p>0)
        t+=a[p],
        p-=(p ^ (p & (p-1)));
    return t;
}

int pozitia(int s)
{
    int i=1,j=n,mij;
    while (i!=j)
    {
        mij=(i+j)/2;
        if (suma(mij)>=s) j=mij; else i=mij+1;
    }
    if (suma(i)==s) return i; else return -1;
}

/*int pozitia(int s)
{
    int i=0,p;
    for(p=1; p*2<=n; p*=2);
    while (p>0 && s>0 && i<n)
    {
        while (i+p>n || a[i+p]>s) p/=2;
        i+=p;
        s-=a[i];
        p/=2;
    }
    if (!s) return i; else return -1;
}*/

int main()
{
    f >> n >> m;
    fill_n(a,n+1,0);
    for (i=1; i<=n; i++)
    {
        f >> x;
        modifica(i,x);
    }
    for (i=m; i--;)
    {
        f >> c;
        if (c<2)
        {
            f >> x >> y;
            if (c) g << suma(y)-suma(x-1) << "\n";
            else modifica(x,y);
        } else
        {
            f >> x;
            g << pozitia(x) << "\n";
        }
    }
    return 0;
}