Cod sursa(job #3160298)

Utilizator dragoncrackCandidatu Mario Luca dragoncrack Data 23 octombrie 2023 17:30:10
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>

using namespace std;

int n, m;
int AIB[100001];

void update(int poz, int val) {
    for (int i = poz; i <= n; i += (i & -i)) {
        AIB[i] += val;
    }
}

int query(int poz) {
    int sum = 0;
    for (int i = poz; i > 0; i -= (i & -i)) {
        sum += AIB[i];
    }
    return sum;
}

int findSum(int sum) {
    int st = 1;
    int dr = n;
    while (st <= dr) {
        int mid = (st + dr) / 2;
        int midSum = query(mid);
        if (midSum == sum)
            return mid;
        if (midSum < sum)
            st = mid + 1;
        else if (midSum > sum)
            dr = mid - 1;
    }
    return -1;
}

int main()
{
    FILE *inFile, *outFile;
    inFile = fopen("aib.in", "r");
    outFile = fopen("aib.out", "w");
    fscanf(inFile, "%i %i", &n, &m);
    for (int i = 1; i <= n; i++) {
        int x;
        fscanf(inFile, "%i", &x);
        update(i, x);
    }
    for (int i = 1; i <= m; i++) {
        int op, a, b;
        fscanf(inFile, "%i", &op);
        if (op == 0) {
            fscanf(inFile, "%i %i", &a, &b);
            update(a, b);
        }
        if (op == 1) {
            fscanf(inFile, "%i %i", &a, &b);
            fprintf(outFile, "%i %c", query(b) - query(a - 1), '\n');
        }
        if (op == 2) {
            fscanf(inFile, "%i", &a);
            fprintf(outFile, "%i %c", findSum(a), '\n');
        }
    }
}