Cod sursa(job #1183103)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 8 mai 2014 15:16:09
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#define ub(x) (x&(-x))
using namespace std;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
long n,i,x,m,y,v[100001],a,b,t,sum,st,dr,mij;
void add(long x,long val)
{
    int i;
    for (i=x;i<=n;i+=ub(i))
        v[i]+=val;
}
long suma(long x)
{
    long s=0,i;
    for (i=x;i>0;i-=ub(i))
        s+=v[i];
    return s;
}
int main()
{
    fscanf(f,"%ld%ld",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%ld",&x);
        add(i,x);
    }
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%ld",&t);
        if (t==0 || t==1)
            fscanf(f,"%ld%ld",&a,&b);
        else
            fscanf(f,"%ld",&a);
        if (t==0)
            add(a,b);
        else if (t==1)
        {
            sum=suma(b)-suma(a-1);
            fprintf(g,"%ld\n",sum);
        }
        else
        {
            st=1;
            dr=n;
            mij=(st+dr)/2;
            while (st<dr-1 && suma(mij)!=a)
            {

                if (suma(mij)<a)
                    st=mij;
                else
                    dr=mij;
                mij=(st+dr)/2;
            }
            if (suma(1)==a)
                mij=1;
            if (suma(n)==a)
                mij=n;
            if (suma(mij)==a)
                fprintf (g,"%ld\n",mij);
            else
                fprintf (g,"-1\n");
        }
    }
    fclose(f);
    return 0;
}