Cod sursa(job #1425436)

Utilizator TincaMateiTinca Matei TincaMatei Data 27 aprilie 2015 14:57:43
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda pregatire-lot-aib Marime 1.24 kb
#include <stdio.h>

int aib[100001];

int lastbit(int x){
    return x&(-x);
}

int capat(int x){
    return x-lastbit(x)+1;
}

int sum(int n){
    int s;
    s=0;
    while(n>0){
        s=s+aib[n];
        n=capat(n)-1;
    }
    return s;
}

void add(int pos,int val,int n){\
    int i;
    i=pos;
    while(i<=n){
        aib[i]=aib[i]+val;
        i=i+lastbit(i);
    }
}

int search(int a,int n){
    int st,dr,s,m;
    st=1;
    dr=n;
    while(st<=dr){
        m=(st+dr)/2;
        s=sum(m);
        if(a<=s)
            dr=m-1;
        else
            st=m+1;
    }
    if(sum(st)==a)
        return st;
    else
        return -1;
}

int main(){
    int n,m,x,i,f,a,b;
    FILE *fin=fopen("aib.in","r");
    FILE *fout=fopen("aib.out","w");
    fscanf(fin,"%d%d",&n,&m);

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

    for(i=0;i<m;i++){
        fscanf(fin,"%d",&f);
        if(f==0){
            fscanf(fin,"%d%d",&a,&b);
            add(a,b,n);
        }else if(f==1){
            fscanf(fin,"%d%d",&a,&b);
            fprintf(fout,"%d\n",sum(b)-sum(a-1));
        }else{
            fscanf(fin,"%d",&a);
            fprintf(fout,"%d\n",search(a,n));
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}