Cod sursa(job #1795521)

Utilizator proflaurianPanaete Adrian proflaurian Data 2 noiembrie 2016 16:53:04
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define N 100010
#define tip long long
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
tip aib[N],x,query(unsigned);
unsigned n,m,i,cod,a,b,lo,hi,mi;
void update(unsigned,tip);
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x;
        update(i,x);
    }
    for(;m;m--)
    {
        f>>cod;
        if(cod==0)
        {
            f>>a>>x;
            update(a,x);
        }
        else
            if(cod==1)
            {
                f>>a>>b;
                g<<query(b)-query(a-1)<<'\n';
            }
            else
            {
                f>>x;
                for(lo=0,hi=n+1;hi-lo-1;)
                {
                    mi=(lo+hi)/2;
                    if(query(mi)<=x)
                        lo=mi;
                    else
                        hi=mi;
                }
                if(query(lo)==x)
                    g<<lo<<'\n';
                else
                    g<<"-1\n";
            }
    }
    return 0;
}
tip query(unsigned p)
{
    tip r;
    for(r=0;p;p-=p&(-p))
        r+=aib[p];
    return r;
}
void update(unsigned p,tip v)
{
    for(;p<=n;p+=p&(-p))
        aib[p]+=v;
}