Cod sursa(job #2635030)

Utilizator irimia_alexIrimia Alex irimia_alex Data 13 iulie 2020 00:04:42
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define NMAX 100000

using namespace std;

FILE* fin, * fout;

int n, m, v[NMAX+1];
int aib[NMAX + 1] = { 0 };

void update(int index, int val) {
    while (index <= n) {
        aib[index] += val;
        index += index & (-index);
    }
}

int getSum(int i, int j) {
    int s1 = 0, s2 = 0;
    while (j > 0) {
        s1 += aib[j];
        j -= j & (-j);
    }
    --i;
    while (i > 0) {
        s2 += aib[i];
        i -= i & (-i);
    }
    return s1 - s2;
}

int findK(int k) {
    int i = 1, j = n;
    while (i < j) {
        int m = i + (j - i) / 2;
        int s = getSum(1, m);
        if (s == k && getSum(1, m - 1) != k)
            return m;
        if (s < k)
            i = m + 1;
        else
            j = i - 1;
    }
}

int main()
{
    fin = fopen("aib.in", "r");
    fout = fopen("aib.out", "w");

    fscanf(fin, "%i %i", &n, &m);
    for (int i = 1;i <= n;++i) {
        fscanf(fin,"%i", &v[i]);
        update(i, v[i]);
    }
    while (m--) {
        int t;
        fscanf(fin,"%i", &t);
        if (t == 2) {
            int k;
            fscanf(fin, "%i", &k);
            fprintf(fout,"%i\n", findK(k));
        }
        else {
            int x, y;
            fscanf(fin, "%i %i", &x, &y);
            if (t == 0) {
                update(x, y);
            }
            else {
                fprintf(fout,"%i\n", getSum(x, y));
            }
        }
    }
  
    return 0;
}