Cod sursa(job #2032423)

Utilizator rangal3Tudor Anastasiei rangal3 Data 4 octombrie 2017 22:27:50
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#define in "aib.in"
#define out "aib.out"
#define N 100003
#define zerouri(x) ((x^(x-1))&x)

using namespace std;

ifstream fin(in);
ofstream fout(out);

int A[N];
int n,m,x,y,p;
int pos,val;

inline void adauga()
{
    while(pos <= n)
    {
        A[pos] += val;
        pos += zerouri(pos);
    }
}

inline int suma(int E)
{
    if(E == 0) return 0;
    return A[E] + suma(E-zerouri(E));
}

inline int poz_minim(int S)
{
    for(int i=1; i<=n; ++i)
        if(suma(i) == S) return i;
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        fin>>val;
        pos = i;
        adauga();
    }

    while(m--)
    {
        fin>>p;
        if(p == 0)
        {
            fin>>pos>>val;
            adauga();
        }
        else if(p == 1)
        {
            fin>>x>>y;
            fout<<suma(y) - suma(x-1)<<"\n";
        }
        else if(p == 2)
        {
            fin>>x;
            fout<<poz_minim(x)<<"\n";
        }
    }

    fin.close(); fout.close();
    return 0;
}