Pagini recente » Cod sursa (job #1415554) | Cod sursa (job #1747551) | Cod sursa (job #1877830) | Cod sursa (job #1268943) | Cod sursa (job #1313545)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
const int NMAX = 100000 + 1;
int n, m;
int aib[NMAX];
void update(int val, int poz) {
for (; poz <= n; poz += poz & (poz - 1) ^ poz)
aib[poz] += val;
}
int query(int x) {
int s = 0;
for (int i = x; i; i -= i & (-i))
s = s + aib[i];
return s;
}
int cauta(int st, int dr, int val) {
int m, sol, rez;
while (st <= dr) {
m = (st + dr) / 2;
rez = query(m);
if (rez <= val) {
sol = rez;
st = m + 1;
if (sol == val) return m;
}
else dr = m - 1;
}
return -1;
}
void citeste() {
f >> n >> m;
int x;
for (int i = 1; i <= n; i++) {
f >> x;
update(x, i);
}
}
void rezolva() {
int tip, a, b;
for (int i = 1; i <= m; i++) {
f >> tip;
if (tip == 2) {
f >> a;
g << cauta(1, n, a) << '\n';
continue;
}
f >> a >> b;
if (tip == 0) update(b, a);
else g << query(b) - query(a - 1) << '\n';
}
}
int main() {
citeste();
rezolva();
}