Cod sursa(job #1959191)

Utilizator DragosCDragos Corleanca DragosC Data 9 aprilie 2017 10:28:09
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#define zeros(x) ((x^(x-1))&x)
using namespace std;
int n,m;
int aib[1000];
void op0(int x, int q)
{
    for(int i=x;i<=n;i+=zeros(i))
        aib[i]+=q;
}
int Compute(int x)
{
    int sum=0;
    for(int i=x;i>0;i-=zeros(i))
        sum+=aib[i];
    return sum;
}
int op1(int a, int b)
{
    return Compute(b)-Compute(a-1);
}

int op2(int a, int i, int j)
{
    if(i==j)
        {
            if(Compute(i)==a)
                return i;
            else return -1;
        }
    int mij=(i+j)/2;
    int x=Compute(mij);
    if(x==a)
        return mij;
    else if(x<a) return op2(a,mij+1,j);
    else return op2(a,i,mij-1);

}

int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    f>>n>>m;
    int x;
    for(int i=1;i<=n;i++)
    {
        f>>x;
        op0(i,x);
    }
    int y,z;
    for(int i=1;i<=m;i++)
    {
        f>>x;
        if(x==0)
        {
            f>>y>>z;
            op0(y,z);
        }
        else if(x==1)
        {
            f>>y>>z;
            g<<op1(y,z)<<'\n';
        }
        else
        {
            f>>y;
            g<<op2(y,1,n)<<'\n';
        }
    }
    return 0;
}