Cod sursa(job #2570317)

Utilizator AnnaLipianuLipianu Ana AnnaLipianu Data 4 martie 2020 16:04:38
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>

int s[100005], n;

int len(int x)
{
    return x-(x&(x-1));
}

int query(int pz)
{
    int sum=0;
    while(pz>0)
    {
        sum+=s[pz];
        pz=pz-len(pz);
    }
    return sum;
}

void solve(int pz, int val)
{
    while(pz<=n)
	{
		s[pz]+=val;
		pz+=len(pz);
    }
}

using namespace std;

int main() {

	int m, a, b, i, nr, c, p, j, l, med;

    ifstream cin("aib.in");
    ofstream cout("aib.out");
    cin>>n>>m;
    for(i=1;i<=n;i++) {
            cin>>nr;
            solve(i, nr);
    }
    for(i=1;i<=m;i++)
    {
		cin>>c;
		if(c==0 || c==1)
		{
            cin>>a>>b;
            if(c==0)
                    solve(a, b);
            if(c==1)
                    cout<<query(b)-query(a-1)<<"\n";
		}
    else
    {
            cin>>a;
            if(a==0)
                    cout<<"-1";
            else {
                    l=0;
					med=1<<20;
					while(med)
					{
						if(l+med<=n && a>=s[l+med])
						{
							l=l+med;
							a=a-s[l];
						}
                    med=med/2;
					}
            if(a==0)
                    cout<<l;
            else
                    cout<<"-1";

			}
    cout<<"\n";
    }
}
    return 0;
}