Cod sursa(job #2818562)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 16 decembrie 2021 15:09:46
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <stdio.h>

using namespace std;

#define MAXN 100000

int aib[MAXN + 1], v[MAXN + 1];

int lsb(int a){
  return (a & (-a));
}
int query(int poz){
  int s;
  s = 0;
  while(0 < poz){
    s += aib[poz];
    poz -= lsb(poz);
  }
  return s;
}
void update(int poz, int add, int n){
  while(poz <= n){
    aib[poz] += add;
    poz += lsb(poz);
  }
}
int cautare(int e, int n){
  int min, max, mij;
  min = 1;
  max = n + 1;
  while((max - min) > 1){
    mij = (min + max) / 2;
    if(e < query(mij)){
      max = mij;
    }else{
      min = mij;
    }
  }
  return min;
}
int verif(int i, int b){
  if(query(i) == b){
    return i;
  }else{
    return -1;
  }
}

int main()
{
    FILE *fin, *fout;
    int n, q, i, op, a, b;
    fin = fopen("aib.in", "r");
    fscanf(fin, "%d%d", &n, &q);
    for(i = 1; i <= n; i++){
      fscanf(fin, "%d", &v[i]);
    }
    for(i = 1; i <= n; i++){
      aib[i] += v[i];
      if((i + lsb(i)) <= n){
        aib[i + lsb(i)] += aib[i];
      }
    }
    fout = fopen("aib.out", "w");
    for(i = 0; i < q; i++){
      fscanf(fin, "%d", &op);
      if(op == 0){
        fscanf(fin, "%d%d", &a, &b);
        update(a, b, n);
        v[a] += b;
      }else if(op == 1){
        fscanf(fin, "%d%d", &a, &b);
        fprintf(fout, "%d\n", query(b) - query(a - 1));
      }else{
        fscanf(fin, "%d", &a);
        fprintf(fout, "%d\n", verif(cautare(a, n), a));
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}