Cod sursa(job #1766743)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 28 septembrie 2016 15:41:10
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include<cstdio>
using namespace std;
int aib[100001];
int n;
int query (int p){
  int rez=0,pow2;
  while(p!=0){
    rez+=aib[p];
    pow2=(p&(-p));
    p-=pow2;
  }
  return rez;
}
void update(int p,int val){
  int pow2;
  while(p<=n){
    aib[p]+=val;
    pow2=(p&(-p));
    p+=pow2;
  }
}
int searcherino(int val){
  int i=0,pas=1<<16;
  while(pas!=0){
    if(i+pas<=n && aib[i+pas]<=val){
      i+=pas;
      val-=aib[i];
    }
    pas/=2;
  }
  if(val==0)
    return i;
  return -1;
}
int main()
{
    int m,i,a,b,var;
    FILE*fin,*fout;
    fin=fopen("aib.in","r");
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
      fscanf(fin,"%d",&a);
      update(i,a);
    }
    fout=fopen("aib.out","w");
    for(i=1;i<=m;i++){
      fscanf(fin,"%d",&var);
      if(var==0){
        fscanf(fin,"%d%d",&a,&b);
        update(a,b);
      }
      if(var==1){
        fscanf(fin,"%d%d",&a,&b);
        fprintf(fout,"%d\n",query(b)-query(a-1));
      }
      if(var==2){
        fscanf(fin,"%d",&a);
        fprintf(fout,"%d\n",searcherino(a));
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}