Cod sursa(job #1608026)

Utilizator razvandRazvan Dumitru razvand Data 21 februarie 2016 19:32:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <stdio.h>
#define MAX 100000

using namespace std;

int aib[MAX+3];
int n,m;
int nr;

void updateT(int p, int nr) {
    while(p <= n) {
        aib[p] += nr;
        p += p-(p&(p-1));
    }
}
int sumT(int p) {
    int sum = 0;
    while(p != 0) {
        sum += aib[p];
        p = p&(p-1);
    }
    return sum;
}

int searchT(int st, int dr, int s) {
    if(st > dr)
        return -1;
    int mid = st+((dr-st)/2);
    int s2 = sumT(mid);
    if(s2 < s)
        return searchT(mid+1, dr, s);
    if(s2 > s)
        return searchT(st, mid-1, s);
    return mid;
}

int main() {

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

    fscanf(fin, "%d %d", &n, &m);

    for(int i = 0; i < n; i++) {
        fscanf(fin, "%d", &nr);
        updateT(i+1, nr);
    }
    int t,a,b;
    for(int i = 0; i < m; i++) {
        fscanf(fin, "%d", &t);
        if(t == 0) {
            fscanf(fin, "%d %d", &a, &b);
            updateT(a, b);
        } else if(t == 1) {
            fscanf(fin, "%d %d", &a, &b);
            fprintf(fout, "%d\n", sumT(b)-sumT(a-1));
        } else if(t == 2) {
            fscanf(fin, "%d", &a);
            fprintf(fout, "%d\n", searchT(1, n, a));
        }
    }

    return 0;
}