Cod sursa(job #1527825)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 18 noiembrie 2015 19:29:58
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <stdlib.h>
#define zeros(x) (x&(-x))
#define MAXN 100001
int aib[MAXN],n;
inline void add(int poz,int s){
    int i;
    for(i=poz;i<=n;i+=zeros(i))
        aib[i]+=s;
}
inline int sum(int poz){
    int i,s=0;
    for(i=poz;i>0;i-=zeros(i))
        s+=aib[i];
    return s;
}
int main(){
    FILE*fi,*fout;
    int i,m,a,b,rez,pas,t,nr;
    fi=fopen("aib.in" ,"r");
    fout=fopen("aib.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&m);
    for(i=1;i<=n;i++){
        fscanf(fi,"%d" ,&nr);
        add(i,nr);
    }
    for(i=0;i<m;i++){
        fscanf(fi,"%d" ,&t);
        if(t==0){
            fscanf(fi,"%d%d" ,&a,&b);
            add(a,b);
        }
        if(t==1){
            fscanf(fi,"%d%d" ,&a,&b);
            fprintf(fout,"%d\n" ,sum(b)-sum(a-1));
        }
        if(t==2){
            fscanf(fi,"%d" ,&a);
            rez=0;
            for(pas=1<<18;pas;pas>>=1)
                if(rez+pas<=n&&sum(rez+pas)<a)
                   rez+=pas;
            if(sum(rez+1)==a)
               fprintf(fout,"%d\n" ,rez+1);
            else
                fprintf(fout,"-1\n");
        }
    }
    fclose(fi);
    fclose(fout);
    return 0;
}