Cod sursa(job #2602994)

Utilizator avtobusAvtobus avtobus Data 18 aprilie 2020 13:29:45
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < n; i++)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int INF = 0x3f3f3f3f;
const int Nmax = 200555;
ifstream fin ("aib.in");
ofstream fout ("aib.out");

int s = 1, a[Nmax], aib[Nmax];

void add(int pos, int val) {
  do {
    aib[pos] += val;
    pos += pos & -pos;
  } while(pos <= s);
}

int prefix(int pos) {
  int ans = 0;
  while(pos) {
    ans += aib[pos];
    pos -= pos & -pos;
  }
  return ans;
}

int main(void) {
  // freopen("aib.in", "r", stdin);
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL);

  int N, M;
  fin >> N >> M;
  while(s < N) { s *= 2; }

  for(int i = 1; i <= N; i++) {
    fin >> a[i];
    int x = i;
    do {
      aib[x] += a[i];
      x += x&(-x);
    } while(x <= s);
  }

  int q,u,v, pos, sum;
  rep(i, M) {
    fin >> q;
    switch(q) {
      case 0:
        fin >> u >> v;
        add(u, v);
        break;
      case 1:
        fin >> u >> v;
        fout << (prefix(v) - prefix(u-1)) << '\n';
        break;
      case 2:
        fin >> u;
        pos = 0;
        sum = 0;
        for(int step = s; step; step /= 2) {
          if (pos+step <= N && sum + aib[pos+step] <= u) {
            sum += aib[pos+step];
            pos += step;
          }
        }
        if (u == 0 || sum != u) {
          fout << -1 << '\n';
        } else {
          fout << pos << '\n';
        }
        break;
    }
  }


  return 0;
}