Cod sursa(job #2426033)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 25 mai 2019 19:35:12
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.53 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
long long n, m, i, j, x, y, p, tip, s, l, r, nr;
pair<long long,long long> v[300005];
long long val[300005];
void fa_perechi(long long nod)
{
    if(nod<p)
    {
        fa_perechi(2*nod);
        fa_perechi(2*nod+1);
        v[nod].first=v[2*nod].first;
        v[nod].second=v[2*nod+1].second;
        val[nod]=val[2*nod]+val[2*nod+1];
    }
}
void fa_0(long long nod, long long poz, long long x)
{
    if(v[nod].first==poz&&v[nod].second==poz)
    {
        val[nod]+=x;
    }
    else if(v[nod].first<=poz&&v[nod].second>=poz)
    {
        fa_0(nod*2,poz,x);
        fa_0(nod*2+1,poz,x);
        val[nod]=val[nod*2]+val[nod*2+1];
    }
}
void fa_1(long long nod, long long l, long long r)
{
    if (v[nod].first>=l&&v[nod].second<=r)s+=val[nod];
    else if((v[nod].first<=l&&v[nod].second>=r)||(v[nod].first>=l&&v[nod].first<=r&&v[nod].second>r)||(v[nod].second<=r&&v[nod].second>=l&&v[nod].first<l))
    {
        fa_1(nod*2,l,r);
        fa_1(nod*2+1,l,r);
    }
}
long long fa_2(long long nod, long long scaut, long long asociat, int s)
{
   /// asociat=p la inceput
    if(s+val[nod]>scaut)
    {
        if(asociat==1)
            return -1;
        fa_2(nod*2,scaut,asociat/2,s);
    }
    else if(s+val[nod]<scaut)
    {
        nr+=min(asociat,n);
        fa_2(nod+1,scaut,asociat,s+val[nod]);
    }
    else return nr+min(asociat,n);
}
int main()
{
    fin>>n>>m;
    p=1;
    while(p<n)
    {
        p*=2;
    }
    for(i=p;i<=p+n-1;i++)
        fin>>val[i],v[i].second=v[i].first=i-p+1;
    for(i=p+n;i<p*2;i++)
        v[i].first=v[i].second=i-p+1;
    fa_perechi(1);
    for(i=1;i<=p*2;i++)
        v[i].second=min(v[i].second,n);
    fout<<p<<'\n';
    for(j=1;j<=m;j++)
    {
        fin>>tip;
        if(tip==2)
        {
            s=0,nr=0;
            fin>>x;
            if(x>val[1])
            {
                fout<<-1;
                continue;
            }
            fout<<fa_2(1,x,p,s)<<'\n';
         //   fin>>x;
           // fa_2(x);
        }
        else if(tip==1)
        {
            fin>>l>>r;
            s=0;
            fa_1(1,l,r);
            fout<<s<<'\n';
        }
        else
        {
            fin>>l>>r;
            fa_0(1,l,r);
           // fout<<'\n';
            //for(i=1;i<=p*2;i++)
            //fout<<i<<' '<<val[i]<<' '<<v[i].first<<' '<<v[i].second<<'\n';
           // fout<<'\n';
        }
    }
    return 0;
}