Cod sursa(job #3175897)

Utilizator vladdobro07vladdd vladdobro07 Data 26 noiembrie 2023 15:26:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
#define lsb(x) x&(-x)
using namespace std;
const int nmax=100000;
struct AIB {
  vector<int> aib;
  int n;
  AIB(int N) {
    n=N;
    aib.resize(n+1);
  }
  void update(int poz,int val) {
    for(; poz<=n; poz+=lsb(poz))
      aib[poz]+=val;
  }
  int queryPref(int poz) {
    int s=0;
    for(; poz>0; poz-=lsb(poz))
      s+=aib[poz];
    return s;
  }
  int query(int st,int dr) {
    return queryPref(dr)-queryPref(st-1);
  }
  int binsearch(int x) {
    int s=0,ans=0;
    for(int i=24; i>=0; i--) {
      if(ans+(1<<i)<=n && s+aib[ans+(1<<i)] < x) {
        s+=aib[ans+(1<<i)];
        ans+=(1<<i);
      }
    }
    ans++;
    if(ans>n || queryPref(ans)!=x)
      return -1;
    else
      return ans;
  }
};

int main() {
  ifstream cin("aib.in");
  ofstream cout("aib.out");
  int n,q,x,y,t;
  cin>>n>>q;
  AIB aib(n);
  for(int i=1; i<=n; i++) {
    cin>>x;
    aib.update(i,x);
  }
  for(int i=1; i<=q; i++) {
    cin>>t>>x;
    if(t==0) {
      cin>>y;
      aib.update(x,y);
    } else if(t==1) {
      cin>>y;
      cout<<aib.query(x,y)<<"\n";
    } else {
      cout<<aib.binsearch(x)<<"\n";
    }
  }
  return 0;
}