Cod sursa(job #3211362)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 9 martie 2024 10:50:05
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

using namespace std;

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

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

int query (int v)
{
    int sum=0;
    for (int i=v; i>=0; i-=(i&(-i))) {
        if (i==0) break;
        sum+=aib[i];
    }
    return sum;
}

void update(int p, int v)
{
    //cout<<p<<endl;
    for (int i=p; i<=n; i+=(i&(-i))) {
        //cout<<i<<' '<<v<<endl;
        aib[i]+=v;
    }
    //cout<<endl<<endl;
}

int suma (int a, int b)
{
    int sum2=query(b), sum1=query(a-1);
    return sum2-sum1;
}
int main()
{
    int k, a, b, c;
    fin>>n>>k;
    for (int i=1; i<=n; i++) {
        fin>>v[i];
        update(i, v[i]);
        //cout<<v[i]<<' ';
    }
    /*
    cout<<endl;
    for (int i=1; i<=n; i++) {
        cout<<aib[i]<<' ';
    }
    cout<<endl;
    */
    for (int i=1; i<=k; i++) {
        fin>>c;
        if (c==0) {
            fin>>a>>b;
            //cout<<c<<' '<<a<<' '<<b<<endl;
            update(a, b);
        }
        if (c==1) {
            fin>>a>>b;
            //cout<<c<<' '<<a<<' '<<b<<endl;
            fout<<suma(a, b)<<'\n';
        }
        if (c==2) {
            fin>>a;
            int st=1, dr=n, mid, s;
            while (st<=dr) {
                mid=(st+dr)/2;
                s=suma(1, mid);
                if (s==a) break;
                if (s<=a) st=mid+1;
                else dr=mid-1;
            }
            if (s==a) fout<<mid<<'\n';
            else {
                //cout<<"Suma: "<<s<<" "<<a<<endl;
                fout<<"-1\n";
            }
        }
    }
    return 0;
}