Cod sursa(job #2123497)

Utilizator stefanxdanDanila Sergiu Stefan stefanxdan Data 6 februarie 2018 12:16:17
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;
int aib[100005], n,m;

int Query(int p)
///care este suma a[1]+a[2] + ... + a[n]
{
    int s = 0;
    while(p > 0)
    {
        s+= aib[p];
        p-=(p&(-p));
    }
    return s;
}

void Update(int p, int x)
///adauga x la pozitia p
{
    while(p <= n)
    {
        aib[p] += x;
        p+=(p&(-p));
    }
}

int CautaRez(int S)
{
    int st, dr, mid, p, suma;
    p=-1;
    st = 1; dr = n;
    while(st <= dr)
    {
        mid = (st + dr)/2;
        suma = Query(mid);
        if(suma== S) { p = mid; dr = mid -1;}
        else if(suma > S) dr = mid-1;
        else st = mid + 1;
    }
    return p;
}

int main()
{
    int x,p,p2,i, op;
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    fin >> n >> m;
    for(i = 1; i <= n; i++)
    {
        fin >> x;
        Update(i,x);
    }

    for(i = 1; i <= m; i++)
    {
        fin >> op;
        if(op == 0)
        {
            fin >> x >> p;
            Update(p,x);
        }
        else if(op == 1)
        {
            fin >> p >> p2;
            fout << Query(p2) - Query(p-1) << "\n";
        }
        else
        {
            fin >> x;
            fout << CautaRez(x) << "\n";
        }
    }
    fout.close();
    return 0;
}