Cod sursa(job #2817749)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 14 decembrie 2021 09:55:07
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>

using namespace std;

#define MAXN 100000
int aib[MAXN + 1];
int v[MAXN + 1];

int lastBit(int x) {
  return x & -x;
}

void addToSum(int n, int pos, int add) {
  while ( pos + lastBit(pos) <= n ) {
    pos += lastBit(pos);
    aib[pos] += add;
  }
}

int calcSumFromStart(int pos) {
  int s;

  s = 0;
  while ( pos >= 1 ) {
    s += aib[pos];
    pos -= lastBit(pos);
  }

  return s;
}

int calcSum(int first, int last) {
  return calcSumFromStart(last) - calcSumFromStart(first - 1);
}
int main() {
  FILE *fin, *fout;
  fin = fopen("aib.in", "r");
  fout = fopen("aib.out", "w");

  int n, q, i, qnr, a, b, dr, dif, sum;
  fscanf(fin, "%d%d", &n, &q);

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

    if ( i + lastBit(i) <= n ) {
      aib[i + lastBit(i)] += aib[i];
    }
  }

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

    if ( qnr == 0 ) {
      fscanf(fin, "%d%d", &a, &b);
      addToSum(n, a, b);
    } else if ( qnr == 1 ) {
      fscanf(fin, "%d%d", &a, &b);

      fprintf(fout, "%d\n", calcSum(a, b));
    } else {
      fscanf(fin, "%d", &a);

      sum = -1;
      dr = n;
      dif = n / 2;
      while ( dif > 0 && sum != a ) {
        sum = calcSumFromStart(dr);
        if ( sum > a ) {
          dr -= dif;
        }
        if ( sum < a )
          dr += dif;
        dif /= 2;
      }
      if ( sum != a )
        sum = calcSumFromStart(dr);

      if ( sum == a )
        fprintf(fout, "%d\n", dr);
      else
        fprintf(fout, "-1\n");
    }
  }
  return 0;
}