Cod sursa(job #973748)

Utilizator Master011Dragos Martac Master011 Data 15 iulie 2013 14:02:41
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<cstdio>
#define CLOSE fclose(in); fclose(out); return 0;

const int lim = 100010;
int s[lim], cod[lim], arb[lim];

int binary_search(int x){
    int ras=0, pas=1<<4, cont=4;
    while (pas!=1){
        if(x%pas==0){
            x/=pas;
            ras+=cont;
        }
        pas>>=1;
        --cont;
    }
    return ras;
}

void modif(int a, int b, int N){
    while(a<=N){
        arb[a]+=b;
        a+=(1<<cod[a]);
    }
}

int intrebare(int a, int b){
    int s1=0;
    while(b>0){
        s1+=arb[b];
        b-=(1<<cod[b]);
    }

    int s2=0;
    --a;
    while(a>0){
       s2+=arb[a];
       a-=(1<<cod[a]);
    }
    return s1-s2;
}

int pozitie(int a, int N ){
    int poz=0, pas=1<<16,s1,save;
    while(pas){
        if(poz+pas<=N){
            s1=intrebare(1,poz+pas);
            if(s1<=a){
                poz+=pas;
                save=s1;
            }
        }
        pas>>=1;
    }
    if(save==a)
        return poz;
    return -1;
}

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

    int N, M;
    fscanf(in,"%d%d",&N,&M);
    for(int i = 1 ; i <= N ; ++i){
        fscanf(in,"%d",&s[i]);
        s[i]+=s[i-1];
    }

    int Nr0,st;
    for(int i = 1 ; i <= N ; ++i){
        Nr0=binary_search(i);
        cod[i]=Nr0;
        st=i-(1<<Nr0)+1;
        arb[i]=s[i]-s[st-1];
    }

    int val,a,b,RR;
    M++;
    while (--M){
        fscanf(in,"%d",&val);
        if(val==0){
            fscanf(in,"%d%d",&a,&b);
            modif(a,b,N);
        }else
        if(val==1){
            fscanf(in,"%d%d",&a,&b);
            RR=intrebare(a,b);
            fprintf(out,"%d\n",RR);
        }else{
            fscanf(in,"%d",&a);
            RR=pozitie(a,N);
            fprintf(out,"%d\n",RR);
        }
    }
    CLOSE
}