Cod sursa(job #1390016)

Utilizator Arodoet96Teodora Stoleru Arodoet96 Data 16 martie 2015 19:48:19
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define DMAX 100004

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int n, m;
int A[DMAX];

void citire();
void update(int poz, int val);
int query(int poz);
int find(int suma);

int main()
{
    citire();
    return 0;
}

void citire()
{
    int i, tip, a, b;
    fin>>n>>m;
    for(i=1;i<=n;++i)
    {
        fin>>b;
        update(i, b);
    }

    for(i=1;i<=m;++i)
    {
        fin>>tip;

        if(tip==0)
        {
            fin>>a>>b;//valorii de pe pozitia a i se adauga valoarea b
            update(a, b);
        }

        if(tip==1)
        {
            fin>>a>>b;//suma valorilor din intervalul [a, b]
            fout<<query(b)-query(a-1)<<'\n';
        }

        if(tip==2)
        {
            fin>>a;//Sa se determine pozitia minima k astfel incat suma valorilor primilor k termeni sa fie exact a
            fout<<find(a)<<'\n';
        }
    }
}

void update(int poz, int val)
{
    int p;
    for(p=poz;p<=n;p=p+((p^(p-1))&p))
        A[p]+=val;
}

int query(int poz)
{
    int p, suma=0;
    for(p=poz;p;p=p-((p^(p-1))&p))
        suma+=A[p];
    return suma;
}

int find(int suma)
{
    int k, val=0;
    for(k=0;k<=n && val<suma;++k, val=query(k));
    if(val==suma) return k;
    return -1;
}