Pagini recente » Cod sursa (job #1033535) | Cod sursa (job #1658263) | Cod sursa (job #1112281) | Cod sursa (job #1533346) | Cod sursa (job #2328507)
/*
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 >= 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);
}