Cod sursa(job #2656237)

Utilizator adiaioanaAdia R. adiaioana Data 7 octombrie 2020 10:32:23
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#define NMAX 100100
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
unsigned int s[NMAX], C[NMAX], n;
int sum(int x)
{
    int S=0,p;
    while(x)
    {
        S+=C[x];
        p=(x^(x-1))&x;
        x^=p;
    }
    return S;
}
int main()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(0);

    int p,a,q, st, mij, dr, sol,op,b,x,S;
    cin>>n>>q;
    for(int i=1; i<=n; ++i)
    {
        cin>>a;
        s[i]=s[i-1]+a;
        p=(i^(i-1))&i;
        C[i]=s[i]-s[i-p];
    }
    while(q--)
    {
        cin>>op>>a;
        if(op==0)
        {
            cin>>b; x=a;
            do{
                C[x]+=b;
                p=(x^(x-1))&x;
                x=x+p;
            }while(x<=n);
        }
        else if(op==1)
        {
            cin>>b;
            S=sum(b)-sum(a-1);
            cout<<S<<'\n';
        }
        else{
            st=1; dr=n; mij=0; sol=-1;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                S=sum(mij);
                if(S<a)
                    st=mij+1;
                else if(S>a)
                    dr=mij-1;
                else sol=mij, dr=mij-1;
            }
            cout<<sol<<'\n';
        }
    }

    return 0;
}