Cod sursa(job #1550010)

Utilizator herbertoHerbert Mohanu herberto Data 13 decembrie 2015 01:12:03
Problema Arbori indexati binar Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100001

int v[MAXN];
int x, y, n;

int lsb(int x){
  return x^(x&(x-1));
}
void update(int x, int y){
  while(x<=n){
    v[x]+=y;
    x+=lsb(x);
  }
}
inline int querry(int x){
  int s;
  s=0;
  while(x>0){
    s+=v[x];
    x-=lsb(x);
  }
  return s;
}
int cautbin(int x){
  int st=1, dr=n, mij;
  while(st<=dr){
    mij=(dr+st)/2;
    if(x<=querry(mij))
      dr=mij;
    else
      st=mij;
  }
  if(querry(dr)==x)
    return dr;

  return -1;
}
int main(){
  FILE*fin=fopen("aib.in", "r");
  FILE*fout=fopen("aib.out", "w");
  int n, m, i, tip, x, y, nr, j;
  fscanf(fin, "%d%d", &n, &m);
  for(i=1; i<=n; i++){
    fscanf(fin, "%d", &nr);
    update(i, nr);
  }
//  for(i=1; i<=n; i++)
//    printf("%d ", v[i]);
  for(i=1; i<=m; i++){
    fscanf(fin, "%d", &tip);
    if(tip!=2){
      fscanf(fin, "%d%d", &x, &y);
      if(tip==0){
        update(x, y);
        fprintf(fout, "%d\n", v[x]);
      }
      if(tip==1)
        fprintf(fout, "%d\n", querry(y)-querry(x-1));
    }
    else{
      fscanf(fin, "%d", &x);
      fprintf(fout, "%d\n", cautbin(x));
    }
//    printf("%d %d\n", querry(2), querry(8));
//    for(j=1; j<=n; j++)
//      printf("%d ", v[j]);
//    printf("\n\n");
  }
  return 0;
}