Cod sursa(job #2509461)

Utilizator andreitabaraandrei2004 andreitabara Data 14 decembrie 2019 11:22:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>

using namespace std;
long v[100001],x,i,c,a,b,n,m,j,st,dr,ok,mijl;
ifstream in ("aib.in");
ofstream out ("aib.out");
void up(long x,long p)
{
    long i;
    for(i=p; i<=n; i+=(i&(-i)))
    {
        v[i]+=x;
    }
}

long suma(long p)
{
    long i,s=0;
    for(i=p; i>0; i-=(i&(-i)))
    {
        s+=v[i];
    }

    return s;
}
int main()
{
    in>>n>>m;
    for(i=1; i<=n; i++)
    {
        in>>x;
        up(x,i);
    }

    for(i=1; i<=m; i++)
    {
        in>>c>>a;
        if(c==0)
        {
            in>>b;
            up(b,a);
        }
        else
        {
            if(c==1)
            {
                in>>b;
                out<<suma(b)-suma(a-1)<<'\n';
            }
            else
            {
                st=1;
                dr=n;
                ok=0;
                while(st<=dr)
                {
                    mijl=(st+dr)/2;
                    if(suma(mijl)>a)dr=mijl-1;
                    if(suma(mijl)<a)st=mijl+1;
                    if(suma(mijl)==a)
                    {
                        ok=1;
                        break;
                    }
                }
                if(ok==1) out<<mijl<<'\n';
                else
                {
                    out<<-1<<'\n';
                }
            }
        }

    }
    return 0;
}