Cod sursa(job #2618427)

Utilizator k2e0e0w3qDumitrescu Gheorghe k2e0e0w3q Data 24 mai 2020 20:52:24
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#define log(x) 31-__builtin_clz(x)
#define N 100000

int n, aib[N+1], com;
void update (int i, int x) {
    for (; i<=n; i+=i&(-i))
        aib[i]+=x;
}

int query (int i) {
    int ans=0;
    for (; i; i-=i&(-i))
        ans+=aib[i];
    return ans;
}

int cautbin (int x) {
    int st=1, dr=n, mid, val;

    while (st<=dr) {
        mid=st+((dr-st)>>1);
        val=query(mid);
        if (x > val)
            st=mid+1;
        else
            if (x < val)
                dr=mid-1;
            else
                return mid;
    }
    return -1;
}

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

    int m, i, x, y;
    fscanf(fin, "%d%d", &n, &m);
    com=n;
    if (com&(com-1))
        com=1<<log(com)+1;

    for (i=1; i<=n; ++i) {
        fscanf(fin, "%d", &x);
        update(i, x);
    }

    for (; m; --m) {
        fscanf(fin, "%d", &i);
        switch (i) {
        case 0:
            fscanf(fin, "%d%d", &x, &y);
            update(x, y);
            break;
        case 1:
            fscanf(fin, "%d%d", &x, &y);
            fprintf(fout, "%d\n", query(y)-query(x-1));
            break;
        case 2:
            fscanf(fin, "%d", &x);
            fprintf(fout, "%d\n", cautbin(x));
            break;
        }
    }
    return 0;
}