Pagini recente » Cod sursa (job #2885949) | Cod sursa (job #1300415) | Cod sursa (job #1989031) | Cod sursa (job #1400202) | Cod sursa (job #1300227)
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
int S[4*nmax];
void update(int val, int poz) {
while (poz <= n) {
S[poz] += val;
poz += poz^(poz-1)&poz;
}
}
int query(int poz) {
int s = 0;
while (poz > 0) {
s += S[poz];
poz -= poz^(poz-1)&poz;
}
return s;
}
void findK(int val) {
int lo = 1, hi = n, mid;
while (lo <= hi) {
mid = (hi + lo) >> 1;
int l = query(mid);
if (l == val) {
fout << mid << "\n";
return;
} else if (l < val)
lo = mid + 1;
else
hi = mid - 1;
}
fout << -1 << "\n";
}
void solve() {
int i, op, a, b, x;
fin >> n >> m;
for (i = 1; i <= n; i++) {
fin >> x;
update(x, i);
}
for (i = 1; i <= m; i++) {
fin >> op;
if (op == 0) {
fin >> a >> b;
update(b, a);
} else if (op == 1) {
fin >> a >> b;
fout << query(b) - query(a-1) << "\n";
} else {
fin >> a;
findK(a);
}
}
}
int main() {
solve();
fin.close();
fout.close();
return 0;
}