Cod sursa(job #1183075)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 8 mai 2014 14:51:08
Problema Arbori indexati binar Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#define MAXN 100000
long long aib[MAXN+1], n;
inline long long ub(long long a){
    return a&(-a);
}
inline void add(long long poz, long long val){
    long long i;
    for(i=poz; i<=n; i+=ub(i)){
        aib[i]+=val;
    }
}
inline long long sum(long long a){
    long long i, s;
    s=0;
    for(i=a; i!=0; i-=ub(i)){
        s+=aib[i];
    }
    return s;
}
int main(){
    long long m, i, x, t, a, b, rez, pas;
    FILE *fin, *fout;
    fin=fopen("aib.in", "r");
    fout=fopen("aib.out", "w");
    fscanf(fin, "%lld%lld", &n, &m);
    for(i=1; i<=n; i++){
        fscanf(fin, "%lld", &x);
        add(i, x);
    }
    for(i=1; i<=m; i++){
        fscanf(fin, "%lld", &t);
        switch(t){
            case 0 :
                fscanf(fin, "%lld%lld", &a, &b);
                add(a, b);
                break;
            case 1 :
                fscanf(fin, "%lld%lld", &a, &b);
                fprintf(fout, "%lld\n", sum(b)-sum(a-1));
                break;
            default :
                fscanf(fin, "%lld", &a);
                rez=0;
                for(pas=1<<16; pas!=0; pas>>=1){
                    if((pas+rez<=n)&&(sum(rez+pas)<=a)){
                        rez+=pas;
                    }
                }
                if(sum(rez)==a){
                    fprintf(fout, "%lld\n", rez);
                }else{
                    fprintf(fout, "-1\n");
                }
                break;
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}