Cod sursa(job #2414972)

Utilizator marinaoprOprea Marina marinaopr Data 25 aprilie 2019 13:18:08
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>

#define it(x) x&(-x)
#define NMAX 100005

using namespace std;

FILE *fin = fopen("aib.in", "r");
FILE *fout = fopen("aib.out", "w");

int n,cerinta,q,a,b,i,x,aib[NMAX];

void update(int poz, int x)
{
    for(int i=poz; i<=n; i+=it(i))
        aib[i] += x;
}

int sum(int poz)
{
    int ans = 0;

    for(int i=poz; i>=1; i-=it(i))
        ans += aib[i];

    return ans;
}

int cauta(int a)
{
    int poz = -1;
    int left = 1;
    int right = n, mid;
    while(left <= right)
    {
        mid = (left+right) /2;

        if(sum(mid) >= a)
        {
            poz = mid;
            right = mid-1;
        }
        else
            left = mid+1;
    }

    return poz;
}

int main()
{
    fscanf(fin, "%d%d", &n,&q);
    for(i=1; i<=n; ++i)
    {
        fscanf(fin, "%d", &x);
        update(i,x);
    }

    while(q)
    {
        fscanf(fin, "%d", &cerinta);

        if(cerinta == 0 or cerinta == 1)
        {
            fscanf(fin, "%d%d", &a,&b);
            if(!cerinta)
                update(a, b);
            else
                fprintf(fout, "%d\n", sum(b)-sum(a-1));
        }
        else
        {
            fscanf(fin, "%d", &a);
            fprintf(fout, "%d\n", cauta(a));
        }

        --q;
    }

    fclose(fin);
    fclose(fout);
    return 0;
}