Cod sursa(job #2703107)

Utilizator NoRules123Osadici Darius Bogdan NoRules123 Data 7 februarie 2021 11:49:45
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
#define lsb(x) (x&(-x))
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int nmax=100005;
int aib[nmax],s[nmax],v[nmax],i,j,tip,n,m;
void adauga(int x,int val)
{
    for(int poz=x;poz<=n;poz+=poz&(-poz))
        aib[poz]+=val;
}
int suma(int x)
{
    int s=0;
    for(int poz=x;poz;poz-=poz&(-poz))
        s+=aib[poz];
    return s;
}
int cautbin_min(int val)
{
    /*int st=1,dr=n,ans=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        int temp=suma(mij);
        if(temp<=val)
        {
            if(temp==val)
                ans=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    return ans;
    */
    int sum=0;
    int ans=0;
    bool gasit=false;
    for(int poz=16;poz>=0;poz--)
    {
        if(ans+(1<<poz)<=n && sum+aib[ans+(1<<poz)]<=val)
        {
            ans+=(1<<poz);
            sum+=aib[ans];
            if(sum==val)
                gasit=true;
        }
    }
    if(!gasit)
        return -1;
    else
        return ans;

}
int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>v[i];
    for(i=1;i<=n;i++)
        s[i]=s[i-1]+v[i];
    for(i=1;i<=n;i++)
    {
        int temp=i-lsb(i);
        aib[i]=s[i]-s[temp];
    }
    while(m--)
    {
        fin>>tip;
        if(tip==0)
        {
            int x,val;
            fin>>x>>val;
            adauga(x,val);
        }
        else if(tip==1)
        {
            int st,dr;
            fin>>st>>dr;
            fout<<suma(dr)-suma(st-1)<<'\n';
        }
        else
        {
            int val;
            fin>>val;
            fout<<cautbin_min(val)<<'\n';
        }
    }
    return 0;
}