Cod sursa(job #1744779)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 20 august 2016 14:33:16
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <algorithm>
#include <string>
#include <iostream>
#include <cstdio>
// #include <vec
#include <map>
using namespace std;

#ifdef INFOARENA
#define TEST 0
#else
#define TEST 1
#endif

class IntervalTrees {
public:
  IntervalTrees(const vector<int>& nums) {
    sums.resize(nums.size() + 1);
    for (int i = 0; i < nums.size(); ++i) {
      Update(i + 1, nums[i]);
    }
  }
  int Query(int position) {
    int sum = 0;
    while (position) {
      sum += sums[position];
      position -= position & (-position);
    }
    return sum;
  }
  int Search(int value) {
    int left = 1, right = sums.size();
    while (left < right) {
      int middle = (left + right) / 2;
      int result = Query(middle);
      if (result < value) {
        left = middle + 1;
      } else if (result > value) {
        right = middle - 1;
      } else {
        right = middle;
      }
    }
    if (Query(left) == value) {
      return left;
    } else {
      return -1;
    }
  }
  int Update(int position, int val) {
    while (position < sums.size()) {
      sums[position] += val;
      position += position & (-position);
    }
  }

private:
  vector<int> sums;
};

struct Query {
  int type, x, y;
};

int main() {
  vector<int> nums;
  vector<Query> queries;

  if (TEST) {
    nums = vector<int>({25,42,8,15,1,55,16,67});
    queries = vector<Query>({{0,5,12},{2,25,0},{2,90,0},{1,7,7},{1,2,8},{2,241,0}});

  } else {
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int nums_number, queries_number;
    scanf("%d %d", &nums_number, &queries_number);
    for (int i = 0; i < nums_number; ++i) {
      scanf("%d", &nums[i]);
    }
    for (int i = 0; i < queries_number; ++i) {
      scanf("%d", &queries[i].type);
      if (queries[i].type == 0 || queries[i].type == 1) {
        scanf("%d %d", &queries[i].x, &queries[i].y);
      } else {
        scanf("%d", &queries[i].x);
      }
    }
  }

  IntervalTrees *instance = new IntervalTrees(nums);
  for (Query query : queries) {
    if (query.type == 0) {
      instance->Update(query.x, query.y);
    } else if (query.type == 1) {
      if (query.x > query.y) {
        swap(query.x, query.y);
      }
      printf("%d\n", instance->Query(query.y) - instance->Query(query.x - 1));
    } else {
      printf("%d\n", instance->Search(query.x));
    }
  }

  return 0;
}