Cod sursa(job #974099)

Utilizator Master011Dragos Martac Master011 Data 16 iulie 2013 14:43:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<cstdio>
#define CLOSE fclose(in); fclose(out); return 0;

const int lim = 100010;
int s[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+=(a&-a);
    }
}

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

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

int pozitie(int a, int N ){
    int poz=0, pas=1<<16,s1;
    while(pas){
        if(poz+pas<=N){
            s1=intrebare(1,poz+pas);
            if(s1<a){
                poz+=pas;
            }
            else if(s1==a)
                return poz+pas;
        }
        pas>>=1;
    }
    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];
    }
 //   fprintf(out,"%d\n",s[3481]-s[2483-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[i-(i&-i)];
    }

    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
}