Cod sursa(job #1988684)

Utilizator Daria09Florea Daria Daria09 Data 4 iunie 2017 11:19:33
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#define dim 100005
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,k,arb[dim],val,pos,start,finish,ans,a,sum[dim];
void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        arb[nod]+=val;
        sum[pos]=sum[pos-1]+arb[nod];
        for(int i=n;i>pos;i--)
            sum[i]+=val;
        return;
    }
    int mij=(st+dr)/2;
    if(pos<=mij)
        update(2*nod,st,mij);
    else
        update(2*nod+1,mij+1,dr);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}
void query(int nod,int st,int dr)
{
    if(start<=st&&dr<=finish)
    {
        ans+=arb[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(start<=mij)query(2*nod,st,mij);
    if(finish>mij)query(2*nod+1,mij+1,dr);
}
int Search(int val)
{
    int st,dr,mij;
    st=1; dr=n;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(sum[mij]==val)
            return mij;
        else
            if(val<sum[mij])
            dr=mij-1;
        else
            st=mij+1;
    }
    return -1;
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++)
    {
        f>>val;
        pos=i;
        update(1,1,n);
    }
    int caz;
    for(int i=1; i<=m; i++)
    {
        f>>caz;
        if(caz==0)
        {
            f>>pos>>val;
            update(1,1,n);
        }
        else if(caz==1)
        {
            f>>start>>finish;
            ans=0;
            query(1,1,n);
            g<<ans<<'\n';
        }
        else
        {
            f>>a;
            g<<Search(a)<<'\n';
        }
    }
    return 0;
}