Cod sursa(job #2328506)

Utilizator gabiluciuLuciu Gabriel gabiluciu Data 25 ianuarie 2019 20:35:22
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.92 kb
/*
ID: gabriel100
LANG: C++
TASK:
*/

//#include <iostream>
#include <cstdio>
#include <algorithm>
//#include <time.h>
#include <queue>
#include <cmath>
#include <stack>
#include <fstream>
#include <bitset>
#include <set>

#define nl '\n'
#define all(v) v.begin(),v.end()
#define eb(x) emplace_back(x)
#define ull unsigned long long
#define ll long long
#define LocalName "data"
#define ProblemName "aib"
#ifdef INFOARENA
#define Filename ProblemName
#else
#define Filename LocalName
#endif
#define Input Filename".in"
#define Output Filename".out"
#define str(sir) #sir
#define MOD 32173
using namespace std;
ifstream cin(Input);
ofstream cout(Output);
#ifndef INFOARENA
// TEST
#endif
template<class a, class type>
void print(a v, type t) {
    for_each(all(v), [](type x) { cout << x.first << ' '; });
    cout << nl;
}

int ReadInt() {
    int temp;
    cin >> temp;
    return temp;
}

int GetNextIndex(int currentIndex) {
    return currentIndex + (currentIndex & (-currentIndex));
}

int GetParent(int currentIndex) {
    return currentIndex - (currentIndex & (-currentIndex));
}

void Update(int arr[], int pos, int val, int size) {
    int index = pos;
    while (index <= size) {
        arr[index] += val;
        index = GetNextIndex(index);
    }
}

void ReadArray(int v[], int size) {
    int nr;
    for (int i = 1; i <= size; ++i) {
        cin >> nr;
        Update(v, i, nr, size);
    }
}

void SolveQueryOne(int arr[], int size) {
    int a, b;
    cin >> a >> b;
    Update(arr, a, b, size);
}


ull GetSum(int arr[], int pos) {
    int index = pos;
    ull sum = 0;
    while (index) {
        sum += arr[index];
        index = GetParent(index);
    }
    return sum;
}

void SolveQueryTwo(int arr[]) {
    int a, b;
    cin >> a >> b;
    cout << GetSum(arr, b) - GetSum(arr, a - 1) << nl;
}

int BinarySearch(int arr[], int size, int val) {
    int s = 1;
    while (s < size) s <<= 1;
    int i;
    for (i = 0; s; s >>= 1)
        if (i + s <= size && val >= GetSum(arr, i + s)) i += s;
    return i;
    return ((i > 1 && GetSum(arr, i) == val) ? i : -1);
}

void SolveQueryThree(int arr[], int size) {
    int a;
    cin >> a;
    cout << BinarySearch(arr, size, a) << nl;
}

void SolveQuery(int cod, int arr[], int size) {
    if (cod == 0) {
        SolveQueryOne(arr, size);
    } else if (cod == 1) {
        SolveQueryTwo(arr);
    } else if (cod == 2) {
        SolveQueryThree(arr, size);
    }
}

void Solve(int arr[], int size, int q) {
    int cod;
    for (int i = 1; i <= q; ++i) {
        cin >> cod;
        SolveQuery(cod, arr, size);
    }
}
void Init(int arr[],int size){
    for (int i = 0; i <= size; ++i) {
        arr[i] = 0;
    }
}
int main() {
    ios_base::sync_with_stdio(false);
    //    clock_t tStart = clock();
    int n, m;
    n = ReadInt();
    m = ReadInt();
    int v[n + 2];
    Init(v,n+1);
    ReadArray(v, n);
    Solve(v, n, m);

    //    printf("\nTime taken: %.2fs\n", (double) (clock() - tStart) / CLOCKS_PER_SEC);
}