Cod sursa(job #1511460)

Utilizator serbanSlincu Serban serban Data 26 octombrie 2015 19:48:47
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define zeroes(x) x ^ (x - 1) & x

using namespace std;

int n;
int h[100005];

void adaug(int where, int what) {
    for(int i = where; i <= n; i += zeroes(i)) {
        h[i] += what;
    }
}

int calc(int poz) {
    int s = 0;
    for(poz; poz > 0; poz -= zeroes(poz))
        s += h[poz];
    return s;
}

int caut(int what) {
    int i, step;
    for(step = 1; step <= n; step <<= 1);

    for(i = 0; step; step >>= 1)
        if(i + step <= n)
            if(calc(i + step) <= what)
                i += step;
    return i;
}

int main()
{
    FILE *f = fopen("aib.in", "r");
    FILE *g = fopen("aib.out", "w");

    int m, x;
    fscanf(f, "%d %d", &n, &m);
    for(int i = 1; i <= n; i ++) {
        fscanf(f, "%d", &x);
        adaug(i, x);
    }

    int tip, a, b;
    for(int i = 1; i <= m; i ++) {
        fscanf(f, "%d", &tip);
        if(tip == 0) {
            fscanf(f, "%d %d", &a, &b);
            adaug(a, b);
        }
        else if(tip == 1) {
            fscanf(f, "%d %d", &a, &b);
            fprintf(g, "%d\n", calc(b) - calc(a - 1));
        }
        else {
            fscanf(f, "%d", &a);
            int poz = caut(a);
            if(calc(poz) == a)
                fprintf(g, "%d\n", poz);
            else fprintf(g, "-1\n");
        }
    }

    return 0;
}