Pagini recente » Diferente pentru concursuri intre reviziile 45 si 182 | Cod sursa (job #2316617) | Cod sursa (job #1057663) | Cod sursa (job #1052917) | Cod sursa (job #2675266)
#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <map>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 2e5;
int n, m, a[NMAX + 1], bit[NMAX + 1], x, y, op;
inline void updBIT(int POZ, const int VAL) {
for (; POZ <= n; POZ += (POZ & -POZ))
bit[POZ] += VAL;
}
inline int query(int POZ) {
int TORET = 0;
for (; POZ; POZ -= (POZ & -POZ))
TORET += bit[POZ];
return TORET;
}
inline int query2(const int QUERY) {
int st = 1, dr = n, mij;
while (st <= dr) {
mij = (st + dr) / 2;
int rez = query(mij);
if (rez == QUERY) return mij;
else if (rez > QUERY) dr = mij - 1;
else st = mij + 1;
}
return -1;
}
void constrBIT() {
for (int i = 1; i <= n; ++i)
updBIT(i, a[i]);
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> a[i];
constrBIT();
while (m--) {
fin >> op;
if (op == 0) {
fin >> x >> y;
updBIT(x, y);
}
else if (op == 1) {
fin >> x >> y;
fout << query(y) - query(x - 1) << "\n";
}
else {
fin >> x;
fout << query2(x) << "\n";
}
}
return 0;
}