Cod sursa(job #1742332)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 16 august 2016 12:35:32
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<stdio.h>
using namespace std;
FILE *f1=fopen("aib.in","r");
FILE *f2=fopen("aib.out","w");
int aib[100001],i,j,n,m,v[100001],val,a,b,s1,s2;
void creare(int i){
    int index;
    index=i;
    while(index<=n){
        aib[index]=aib[index]+val;
        index=index+(index & (-index));
    }
}
int sum(int i){
   int index,s=0;
   index=i;
   while(index>0){
     s=s+aib[index];
     index=index-(index&(-index));
   }
   return s;
}
int caut(int val){
   int i,pas;
   pas=1;
   while(pas<=n) pas=pas*2;
   pas=pas/2;
   i=0;
   while(pas>0){
      if (i+pas<=n && val>=aib[i+pas]){
          val=val-aib[i+pas];
          i=i+pas;
          if (val==0) return i;
      }
      pas=pas/2;
   }
   return -1;
}
int main(){
    fscanf(f1,"%d%d",&n,&m);
    for (i=1;i<=n;i++){
        fscanf(f1,"%d",&v[i-1]);
        val=v[i-1];
        creare(i);
    }
    for (i=1;i<=m;i++){
        fscanf(f1,"%d",&j);
        if (j==1 || j==0) fscanf(f1,"%d%d",&a,&b);
          else
            fscanf(f1,"%d",&a);
        if (j==0){
            val=b;
            creare(a);
        }
          else
            if (j==1){
                s1=sum(b);s2=sum(a-1);
                fprintf(f2,"%d\n",s1-s2);
            }
              else{
                 fprintf(f2,"%d\n",caut(a));
              }
    }
    fclose(f1);
    fclose(f2);
    return 0;
}