Pagini recente » Cod sursa (job #2230708) | Cod sursa (job #1435600) | Cod sursa (job #401613) | Cod sursa (job #1118336) | Cod sursa (job #969671)
Cod sursa(job #969671)
#include<stdio.h>
#include<iostream>
#include<cmath>
#define MAX_SIZE 100001
template <typename T>
class BinaryIndexedTree {
public:
BinaryIndexedTree(int);
void insert(T);
void modify(int,T);
T interval_sum(int,int);
int pos_with_sum(T);
void display();
int binary_search(int);
int nr_zeroes(int);
int Sum(int);
private:
T *bit;
T values[MAX_SIZE];
int size;
};
template <typename T>
BinaryIndexedTree<T>::BinaryIndexedTree(int d) {
bit = new T[d];
size = 0;
}
template<typename T>
void BinaryIndexedTree<T>::insert(T val) {
size++;
values[size] = val;
if(size % 2) {
bit[size] = val;
return;
}
else {
int size_c = size, k = 0;
while(size_c % 2 == 0) {
k++;
size_c /= 2;
}
bit[size] = val;
for(int i = size - (1<<k) + 1; i < size; i++)
bit[size] += values[i];
}
}
template<typename T>
void BinaryIndexedTree<T>::modify(int p, T val) {
bit[p] += val;
while(p <= size) {
p += 1<<nr_zeroes(p);
if(p <= size)
bit[p] += val;
}
}
template<typename T>
T BinaryIndexedTree<T>::interval_sum(int st, int dr) {
return Sum(dr) - Sum(st - 1);
}
template<typename T>
int BinaryIndexedTree<T>::nr_zeroes(int p) {
int k = 0;
for(;(p & (1 << k)) == 0; k++);
return k;
}
template<typename T>
int BinaryIndexedTree<T>::Sum(int p) {
T s = 0;
for(; p > 0; p -= 1<<nr_zeroes(p))
s += bit[p];
return s;
}
template<typename T>
int BinaryIndexedTree<T>::binary_search(int val) {
int i, step;
for (step = 1; step < size; step <<= 1);
for (i = 1; step; step >>= 1)
if (i + step <= size && Sum(i + step) <= val)
i += step;
if(Sum(i + step) == val)
return i;
return -1;
}
int main() {
int cod, a, b, N, M, x;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d", &N, &M);
BinaryIndexedTree<int> bit(N);
for(int i = 0; i < N; i++) {
scanf("%d", &x);
bit.insert(x);
}
for(int i = 0; i < M; i++) {
scanf("%d", &cod);
if(cod == 0) {
scanf("%d", &a);
scanf("%d", &b);
bit.modify(a,b);
}
else if(cod == 1) {
scanf("%d", &a);
scanf("%d", &b);
printf("%d\n", bit.interval_sum(a,b));
}
else if(cod == 2) {
scanf("%d", &a);
printf("%d\n", bit.binary_search(a));
}
}
return 0;
}