Cod sursa(job #1362729)

Utilizator RaileanuCristian Raileanu Raileanu Data 26 februarie 2015 14:55:01
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <string.h>

using namespace std;
ifstream f1("aib.in");
ofstream f2("aib.out");
#define N 100*1001
#define DIF (x&(x^(x-1)))
int m;

class AIB
        {
            int n;
            int v[N];
            int caut_bin(int st, int dr, int a);

        public:

            void read();
            void update(int poz, int val);
            int sum(int st, int dr);
            int caut_poz(int a);
        };

void AIB::read()
{
    f1>>n>>m;
    int i,a;
    memset(v, 0, sizeof(v));

    for (i=1; i<=n; i++)
        {
            f1>>a;
            update(i,a);
        }
}

void AIB::update(int poz, int val)
{
    for (int x=poz; x<=n; x+= DIF )
        v[x]+=val;
}

int AIB::sum(int st, int dr)
{
    int sm=0, x;

    for ( x= dr; x >= 1; x-= DIF  )
        sm+=v[x];

    for ( x=st-1; x >= 1; x-= DIF )
        sm-=v[x];

    return sm;
}

int AIB::caut_bin(int st, int dr, int a)
{
    if (st>=dr)
    {
        if ( sum(1,dr) == a  ) return st;
            else return -1;
    }

    int m=(st+dr)/2;

    if ( a <= sum(1,m) )  return caut_bin(st, m, a);
        else return caut_bin(m+1, dr, a);
}

int AIB::caut_poz(int a)
{
    return caut_bin(1,n,a);
}

int main()
{
    AIB a1;
    a1.read();

    int cod, a, b ;
    for (int i=1; i<=m; i++)
    {
        f1>>cod;
        if ( cod == 0 )
            {
                f1>>a>>b;
                a1.update(a,b);
            }
        if ( cod == 1 )
            {
                f1>>a>>b;
                f2<<a1.sum(a,b)<<"\n";
            }
        if ( cod == 2 )
            {
                f1>>a;
                f2<<a1.caut_poz(a)<<"\n";
            }
    }

    f2.close();
    return 0;
}