Cod sursa(job #2281477)

Utilizator dip_BRURDipu Kumar Mohanto dip_BRUR Data 12 noiembrie 2018 12:31:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include "bits/stdc++.h"

using namespace std;

#define in "aib.in"
#define out "aib.out"

#define ll       long long

static const int maxn = 1e5 + 5;

ll tree[maxn];
int n, q;

inline void update(int pos, ll val)
{
      while (pos <= n)
      {
            tree[pos] += val;
            pos += pos & -pos;
      }
}

inline ll read(int pos)
{
      ll sum = 0;
      while (pos > 0)
      {
            sum += tree[pos];
            pos -= pos & -pos;
      }
      return sum;
}

inline ll query(int l, int r)
{
      return read(r) - read(l-1);
}

inline int getK(ll k)
{
      int low = 1;
      int high = n;
      int ans = -1;
      while (low <= high)
      {
            int mid = (low + high) >> 1;
            ll sum = read(mid);
            if (sum == k) ans = mid, high = mid - 1;
            else if (sum < k) low = mid + 1;
            else high = mid - 1;
      }
      return ans;
}

int main()
{
      freopen(in,"r",stdin);
      freopen(out,"w",stdout);

      scanf("%d %d", &n, &q);
      for (int i = 1; i <= n; i++)
      {
            ll x;
            scanf("%lld", &x);
            update(i, x);
      }
      while (q--)
      {
            int type;
            scanf("%d", &type);
            if (type == 0)
            {
                  int pos;
                  ll val;
                  scanf("%d %lld", &pos, &val);
                  update(pos, val);
            }
            else if (type == 1)
            {
                  int l, r;
                  scanf("%d %d", &l, &r);
                  ll sum = query(l, r);
                  printf("%lld\n", sum);
            }
            else
            {
                  ll k;
                  scanf("%lld", &k);
                  int min_index = getK(k);
                  printf("%d\n", min_index);
            }
      }
}