Cod sursa(job #2819689)

Utilizator teodortatomirTeodor Tatomir teodortatomir Data 18 decembrie 2021 20:35:16
Problema Arbori indexati binar Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXX 100001

int aib[MAXX], v[MAXX];

void modif(int n, int p, int a){
  int lsb;

  while(p <= n) {
    aib[p] += a;
    lsb = p & -p;
    p += lsb;
  }
}
int caut(int n, int a){
  int p, l, s, ok;

  l = 1 << 16;
  p = s = ok = 0;
  while(l > 0){
    if(l + p <= n && aib[p + l] + s <= a) {
      ok = 1;
      p += l;
      s += aib[p];
    }
    l /=2;
  }
  if(ok == 0 || s != a)
    p = -1;

  return p;
}
void calc(int n) {
  int i, lsb;

  for(i = 1; i <= n; i++) {
    aib[i] += v[i];
    lsb = i & -i;
    if(i + lsb <= n)
      aib[i + lsb] += aib[i];
  }
}
int intreb(int p) {
  int af, lsb;

  af = 0;
  while(p > 0) {
    af += aib[p];
    lsb = p & -p;
    p -= lsb;
  }

  return af;
}
int main(){
  FILE *fin,*fout;
  int q,n,m,i,a,b;

  fin = fopen("aib.in", "r");
  fout = fopen("aib.out", "w");

  fscanf(fin, "%d%d", &n,&m);
  for(i = 1; i <= n; i++)
    fscanf(fin, "%d", &v[i]);

  calc(n);

  for(i = 0; i < m; i++) {
    fscanf(fin, "%d", &q);

    if(q == 0 || q == 1) {
      fscanf(fin, "%d%d", &a,&b);
      if(q == 0)
        modif(n, a, b);
      else{
        a--;
        fprintf(fout, "%d\n", intreb(b) - intreb(a));
      }
    }
    else {
      fscanf(fin, "%d", &a);
      fprintf(fout, "%d\n", caut(n, a));
    }
  }

  fclose(fin);
  fclose(fout);
  return 0;
}