Cod sursa(job #2030245)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 1 octombrie 2017 12:55:43
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
using namespace std;

ifstream in("aib.in");
ofstream out("aib.out");

int n,m;
int v[100005],aib[100005];

void update(int poz, int val)
{
    while(poz<=n)
    {
        aib[poz]+=val;
        poz+=poz&(-poz);
    }
}

int query(int arg)
{
    int ans=0;
    while(arg)
    {
        ans+=aib[arg];
        arg-=arg&(-arg);
    }
    return ans;
}

int bob(int arg)
{
    int st=1,dr=n;
    int k;

    while(st<=dr)
    {
        int med=(st+dr)/2;
        if(query(med)<=arg)
        {
            k=med;
            st=med+1;
        }
        else dr=med-1;
    }

    if(query(k)==arg) return k;
    return -1;

}

int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        in>>v[i];
        update(i,v[i]);
    }

    int t,a,b;
    while(m--)
    {
        in>>t;
        if(t==0)
        {
            in>>a>>b;
            update(a,b);
        }
        else if(t==1)
        {
            in>>a>>b;
            out<<query(b)-query(a-1)<<'\n';
        }
        else
        {
            in>>a;
            out<<bob(a)<<'\n';
        }
    }

    return 0;
}