Cod sursa(job #908624)

Utilizator DEYDEY2Tudorica Andrei DEYDEY2 Data 9 martie 2013 21:02:40
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int N,Q,i;
int X[100001];
int C[100001];
int p,t,tip,a,b;

// determina 2^p, p fiind cel mai dinspre dreapta bit egal cu 1
int f(int x)
{
    return x & (x^(x-1));
}

// determina suma X[1]+X[2]+...+X[p]
int s(int p)
{
    int suma=0;
    while (p!=0)
    {
        suma+=C[p];
        p-=f(p);
    }
    return suma;
}

int bs(int a)
{
    int st,dr,mij,su;
    st=1;dr=N;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        su=s(mij);
        if(su==a) return mij;
        if(su<a) st=mij+1;
        else dr=mij-1;
    }
    return -1;
}

int main()
{
    fi>>N>>Q;
    for (i=1;i<=N;i++)
    {
        fi>>X[i];
        p=i;
        while (p<=N)
        {
            C[p]+=X[i];
            p=p+f(p);
        }
    }
    for (t=1;t<=Q;t++)
    {
        fi>>tip;
        if (tip==0)
        {
            fi>>a>>b;
            p=a;
            while (p<=N)
            {
                C[p]+=b;
                p=p+f(p);
            }
        }
        if (tip==1)
        {
            fi>>a>>b;
            fo<<s(b)-s(a-1)<<"\n";
        }
        if(tip==2)
        {
            fi>>a;
            fo<<bs(a)<<'\n';
        }
    }
    fi.close();
    fo.close();
    return 0;
}