Cod sursa(job #1948482)

Utilizator ciprianprohozescuProhozescu Ciprian ciprianprohozescu Data 1 aprilie 2017 10:29:54
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#define NMAX 100010

using namespace std;

FILE *fin, *fout;

int n, m, aib[NMAX], sp[NMAX];

void update(int x, int q);
int calcul(int x); //suma pe [1,2, ... x]
int cautare_binara(int x);
int zeros(int x);

int main()
{
    int i, tip, a, b, x;
    fin = fopen("aib.in", "r");
    fout = fopen("aib.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for (i = 1; i <= n; i++)
    {
        fscanf(fin, "%d", &x);
        sp[i] = sp[i - 1] + x;
        aib[i] = sp[i] - sp[i - zeros(i)];
    }
    for (i = 1; i <= m; i++)
    {
        fscanf(fin, "%d", &tip);
        if (!tip)
        {
            fscanf(fin, "%d%d", &a, &b);
            update(a, b);
        }
        else if (tip == 1)
        {
            fscanf(fin, "%d%d", &a, &b);
            fprintf(fout, "%d\n", calcul(b) - calcul(a - 1));
        }
        else
        {
            fscanf(fin, "%d", &a);
            fprintf(fout, "%d\n", cautare_binara(a));
        }
    }
    fclose(fout);
    return 0;
}

void update(int x, int q)
{
    int i;
    for (i = x; i <= n; i += zeros(i))
        aib[i] += q;
}
int calcul(int x)
{
    int i, rez = 0;
    for (i = x; i > 0; i -= zeros(i))
        rez += aib[i];
    return rez;
}
int cautare_binara(int x)
{
    int st = 1, dr = n, mij, rez;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        rez = calcul(mij);
        if (rez < x)
            st = mij + 1;
        else if (rez > x)
            dr = mij - 1;
        else
            return mij;
    }
    return -1;
}
int zeros(int x)
{
    return (x & (-x));
}