Cod sursa(job #3248841)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 13 octombrie 2024 14:27:38
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define NMAX 100500
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int t[NMAX],n;
void update(int val, int i)
{
    for(;i<=n;i+=i&(-i))
        t[i]+=val;
}
int get(int x)
{
    int sum=0;
    for(;x>0;x-=x&(-x))
        sum+=t[x];
    return sum;
}
int caut(int a)
{
    int sz=1, st=0,mij;
    while(sz*2<n)
        sz*=2;
    while(a!=0 && sz>=1)
    {
        mij=(st+sz);
        if(t[mij]>a)
        {
            sz=sz/2;
        }
        if(t[mij]<a)
        {
            st+=sz;
            a=a-t[mij];
        }
        if(t[mij]==a)
            return mij;
    }
    return -1;
}


int m , v[NMAX], c, a, b;
int main()
{
//    25 42 8 15 1 55 16 67
//    25 67 8 90 1 56 16 229

    fin>>n>>m;
    for(int i=1;i<=n;++i)
        fin>>v[i];

    for(int i=1;i<=n;++i)
        update(v[i],i);

    for(int i=1;i<=n;++i)
        cout<<t[i]<<" ";
    for(int i=1;i<=m;++i)
    {
        fin>>c;
        if(c==2)
        {
            fin>>a;

           fout<<caut(a)<<'\n';
        }
        fin>>a>>b;
        if(c==0)
            update(b, a);
        if(c==1)
        {
            int ans=get(b)-get(a-1);
            fout<<ans<<'\n';
        }
    }
    return 0;
}