Cod sursa(job #2818843)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 16 decembrie 2021 23:48:02
Problema Arbori indexati binar Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100000
#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,p;
  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-1;
      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);
      p = search(a,n);

      if(a == query(p))
        fprintf(fout,"%d\n",p +1);
      else
        fprintf(fout,"-1\n");
    }

//    printf("\n");
  }
  fclose(fin);
  fclose(fout);
  return 0;
}