Cod sursa(job #2564095)

Utilizator stef2003Bud Stefan stef2003 Data 1 martie 2020 17:49:38
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <cstdio>

using namespace std;

int v[100001], n;

int len(int x) {
  return (x-(x&(x-1)));
}

void update(int poz, int val) {
  while(poz<=n) {
    v[poz]+=val;
    poz+=len(poz);
  }
}

int query1(int poz) {
  int sum=0;
  while(poz>0) {
    sum+=v[poz];
    poz-=len(poz);
  }
  return sum;
}

int query2(int val) {
  int rez=0, pas=(1<<30);
  while(pas>0) {
    if(rez+pas<=n && v[rez+pas]<=val) {
      rez+=pas;
      val-=v[rez];
    }
    pas/=2;
  }
  return rez;
}

int main() {
  FILE *fin, *fout;
  int m, i, x, a, b;
  fin=fopen("aib.in","r");
  fout=fopen("aib.out","w");
  fscanf(fin, "%d%d",&n,&m);
  for(i=1;i<=n;i++) {
    fscanf(fin, "%d",&x);
    update(i,x);
  }
  for(i=1;i<=m;i++) {
    fscanf(fin, "%d",&x);
    if(x==0) {
      fscanf(fin, "%d%d",&a,&b);
      update(a,b);
    }
    else if(x==1) {
      fscanf(fin, "%d%d",&a,&b);
      fprintf(fout, "%d\n",query1(b)-query1(a-1));
    }
    else {
      fscanf(fin, "%d",&a);
      fprintf(fout, "%d\n",query2(a));
    }
  }
  fclose( fin );
  fclose( fout );
  return 0;
}