Cod sursa(job #3191719)

Utilizator RaresHRares Hanganu RaresH Data 10 ianuarie 2024 14:54:48
Problema Arbori indexati binar Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>

#define MAXN 100000

int bit[MAXN + 1];
  
void update(int poz, int x, int n) {
  while(poz <= n) {
    bit[poz] += x;
    poz += poz & -poz;
  }
}
  
int query(int poz) {
  int rez = 0;

  while(poz > 0) {
    rez += bit[poz];
    poz &= poz - 1;
  }
  
  return rez;
}

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

  fin = fopen("aib.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for(i = 0; i < n; i++) {
    fscanf(fin, "%d", &a);
    update(i + 1, a, n);
  }
  fout = fopen("aib.out", "w");
  for(i = 0; i < m; i++) {
    fscanf(fin, "%d%d", &t, &a);

    if(t == 0) {
      fscanf(fin, "%d", &b);
      update(a, b, n);
    } else if(t == 1) {
      fscanf(fin, "%d", &b);
      fprintf(fout, "%d\n", query(b) - query(a - 1));
    } else {
      st = 1;
      dr = n + 1;
      while(dr - st > 1) {
        mij = (st + dr) / 2;
        if(query(mij) > a)
          dr = mij;
        else
          st = mij;
      }

      fprintf(fout, "%d\n", query(st) == a ? st : -1);
    }
  }
  fclose(fout);
  fclose(fin);

  return 0;
}