Cod sursa(job #2421041)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 13 mai 2019 22:54:42
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, i, j, x, y, p, tip, s, l, r;
pair<int,int> v[300005];
int val[300005];
void fa_perechi(int 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(int nod, int poz, int 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(int nod, int l, int 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);
    }
}
int fa_2(int poz, int nod, int scaut, int nrl)
{
    //fout<<nrl<<' '<<poz<<' '<<nod<<'\n';
    if(nrl>p)
        return -1;
    for(poz;poz<=nrl&&s+val[nod]<=scaut;poz++,nod++)
        s+=val[nod];
    if(s==scaut)
        return v[nod-1].second;
    fa_2(poz,(nod)*2,scaut,nrl*2);
}
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++)
   //     fout<<i<<' '<<val[i]<<' '<<v[i].first<<' '<<v[i].second<<'\n';
    for(j=1;j<=m;j++)
    {
        fin>>tip;
        if(tip==2)
        {
            s=0;
            fin>>x;
            fout<<fa_2(1,1,x,1)<<'\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;
}