Cod sursa(job #2818369)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 15 decembrie 2021 22:28:56
Problema Arbori indexati binar Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100 ///000
#define MAXP2 30

int v[NMAX];

static inline int LastBit(int x){
  return x & (-x);
}

int query(int x){
  int s = 0;

  while(x >= 0){
    s += v[x];
    x -= LastBit(x+1);
  }

  return s;
}

//int search(int k, int n){
//  int p, step, s;
//  s = 0;
//  p = 0;
//
//  for(step = 1<<MAXP2; step > 0; step/=2){
//    if(p+step < n && s + v[p+step] <= k){
//      s += v[p+step];
//      p += step;
//    }
//  }
//
//  return p;
//}
int search(int k, int n){
  int p, step;
  p = 0;

  for(step = 1<<MAXP2; step > 0; step/=2){
//    if(p+step<n)
//      printf("! %d\n",query(step+p));
    if(p+step < n && query(step + p) <= k){
      p += step;
    }
  }

  return p;
}

int main(){
  int n,m,i,j,t,a,b;
  FILE *fin, *fout;

  fin = fopen("aib.in","r");
  fscanf(fin,"%d%d",&n,&m);

  for(i=0;i<n;i++)
    fscanf(fin,"%d",&v[i]);
  for(i=0;i<n;i++){
    if(i + LastBit(i+1) < n)
      v[i + LastBit(i+1)] += v[i];
  }

  fout = fopen("aib.out","w");
  for(i=0;i<m;i++){
//    for(int ii=0;ii<n;ii++)
//      printf("%d ",v[ii]);
//    printf("\n");


    fscanf(fin,"%d",&t);
    if(t == 0){
      fscanf(fin,"%d%d",&a,&b);

      j = a;
      while(j < n){
        v[j] += b;
        j += LastBit(j+1);
      }

    } else if(t == 1){
      fscanf(fin,"%d%d",&a,&b);
      fprintf(fout,"%d\n",query(b-1) - query(a-2));

    } else{
      fscanf(fin,"%d",&a);
      fprintf(fout,"%d\n",search(a,n) +1);
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}