Pagini recente » Cod sursa (job #260156) | Cod sursa (job #73414) | Diferente pentru home intre reviziile 708 si 707 | Cod sursa (job #640845) | Cod sursa (job #2073989)
#include <fstream>
#define MAXN 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int sum[MAXN], n, m;
inline void Update(int poz, int val) {
for (int i = poz; i <= n; i += i & (-i)) {
sum[i] += val;
}
}
inline int Query(int a, int b) {
int s = 0;
for (int i = a - 1; i; i -= (i & (-i))) {
s -= sum[i];
}
for (int i = b; i; i -= (i & (-i)))
s += sum[i];
return s;
}
inline void BinarySearch(int k) {
int ii = 0, step;
for (step = 1; step <= n; step <<= 1);
for (ii = 0; step; step >>= 1) {
if (ii + step <= n && Query(1, ii + step) <= k)
ii += step;
}
if (Query(1, ii) == k)
fout << ii << "\n";
else
fout << "-1\n";
}
inline void Read() {
int tip, a, b, val;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> val;
Update(i, val);
}
for (int i = 1; i <= m; i++) {
fin >> tip;
if (tip == 0) {
fin >> a >> b;
Update(a, b);
}
else if (tip == 1) {
fin >> a >> b;
fout << Query(a, b) << "\n";
}
else {
fin >> a;
BinarySearch(a);
}
}
}
int main () {
Read();
fin.close(); fout.close(); return 0;
}