Cod sursa(job #3201159)

Utilizator Radu_VasileRadu Vasile Radu_Vasile Data 6 februarie 2024 22:34:29
Problema Arbori indexati binar Scor 100
Compilator c-32 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#include <ctype.h>
#define MAXN 100000
int aib[MAXN + 1];
FILE *fin, *fout;
void update(int poz, int val, int n){
  int i;
  for( i = poz; i <= n; i += (i & -i))
    aib[i] += val;
}
int query(int poz){
  int i, sum = 0;
  for( i = poz; i > 0; i -= (i & -i))
    sum += aib[i];
  return sum;
}
int main(){
  int n, i, x, q, a, b, m, st, dr, mij;
  fin = fopen( "aib.in", "r" );
  fout = fopen( "aib.out", "w" );

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

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