Pagini recente » Cod sursa (job #210352) | Cod sursa (job #1872570) | Cod sursa (job #507540) | Cod sursa (job #738253) | Cod sursa (job #3129028)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int NMax = 1e5+5;
int Aib[NMax*3], v[NMax*3], n;
ifstream in("aib.in");
ofstream out("aib.out");
int sum(int index) {
int sum = 0;
index = index + 1;
while (index > 0) {
sum += Aib[index];
index -= (index & -index);
}
return sum;
}
void upd(int index, int val) {
index = index + 1;
while (index <= n) {
Aib[index] += val;
index += (index & -index);
}
}
void construct(int arr[], int n) {
for (int i = 1; i <= n; i++) {
Aib[i] = 0;
}
for (int i = 0; i < n; i++) {
upd(i, arr[i]);
}
}
int search(int y) {
if(y==v[0]){
return 1;
}
int st = 1, dr = n;
while (st < dr) {
int mid = (st + dr) / 2;
int h = sum(mid);
if (h < y) {
st = mid + 1;
} else {
dr = mid;
}
}
if (sum(st) == y) {
return st + 1;
} else {
return -1;
}
}
int main() {
int x, y, z, k;
in >> n >> k;
for (int i = 0; i < n; i++) {
in >> v[i];
}
construct(v, n);
for (int i = 1; i <= k; i++) {
in >> x;
if (x == 0) {
in >> y >> z;
upd(y - 1, z);
} else if (x == 1) {
in >> y >> z;
out << sum(z - 1) - sum(y - 2) << "\n";
} else if (x == 2) {
in >> y;
out << search(y) << "\n";
}
}
return 0;
}