Cod sursa(job #1208624)

Utilizator acomAndrei Comaneci acom Data 16 iulie 2014 11:03:12
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,x,a,b,A[100005];
void update(int P, int X)
{
    for (;P<=n;P+=(P&-P))
        A[P]+=X;
}
int suma(int P)
{
    int s=0;
    for (;P>0;P-=(P&-P))
        s+=A[P];
    return s;
}
int pozsuma(int S)
{
    int st=0,p=1;
    while (p<=n)
        p<<=1;
    for (;p;p>>=1)
    {
        if (st+p<=n && A[st+p]<S)
            S-=A[st+=p];
        else if (st+p<=n && A[st+p]==S)
            return st+p;
    }
    return -1;
}
int main()
{
    int i;
    fin>>n>>m;
    for (i=1;i<=n;++i)
    {
        fin>>x;
        update(i,x);
    }
    for (i=1;i<=m;++i)
    {
        fin>>x;
        switch (x)
        {
            case 0:
                fin>>a>>b;
                update(a,b);
            break;
            case 1:
                fin>>a>>b;
                fout<<suma(b)-suma(a-1)<<"\n";
            break;
            case 2:
                fin>>a;
                fout<<pozsuma(a)<<"\n";
            break;
        }
    }
    return 0;
}