Cod sursa(job #2950013)

Utilizator Pop_EmilPal Tamas Pop_Emil Data 2 decembrie 2022 16:39:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <iostream>

int N, T;
int BIT[100005];

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

int get_sum(int i){

    int j = i;
    int s = 0;
    while(j > 0){
        s += BIT[j];
        j = j - (j & (-j));
    }
    return s;
}

void add(int index, int val){

    int j = index;
    while(j <= N){
        BIT[j] += val;
        j = j + (j & (-j));
    }
}

void read()
{
    fscanf(in, "%d %d", &N, &T);

    for(int i=1; i <= N; ++i)
    {
        int val;
        fscanf(in, "%d", &val);
        add(i, val);
    }
}

int main()
{
    // Read array
    read();

    // Read tests and execute them
    int type;
    int a, b;
    int res;
    for(int i=0; i < T; ++i)
    {
        fscanf(in, "%d", &type);

        switch(type){
            // Add to element at index
            case 0: {
                fscanf(in, "%d %d", &a, &b);
                add(a, b);
                break;
            }
            // Calculate interval sum
            case 1: {
                fscanf(in, "%d %d", &a, &b);

                if(a == 1)
                    res = get_sum(b);
                else
                    res = get_sum(b) - get_sum(a - 1);

                fprintf(out, "%d\n", res);
                break;
            }
            // Sa se determine pozitia minima k astfel incat suma valorilor primilor k termeni sa fie exact a.
            case 2: {
                fscanf(in, "%d", &a);

                int k, L = 1, R = N, M, S;
                while (L <= R) {
                    M = (L + R) / 2;
                    S = get_sum(M);
                    if (S < a)
                        L = M + 1;
                    else if (S > a)
                        R = M - 1;
                    else {
                        k = M;
                        break;
                    }
                }
                if (S == a)
                    fprintf(out, "%d\n", k);
                else
                    fprintf(out, "-1\n");

                break;
            }
        }

    }

    return 0;
}