Pagini recente » Cod sursa (job #2977176) | Cod sursa (job #820454) | Cod sursa (job #1530358) | Cod sursa (job #2389907) | Cod sursa (job #2672823)
#include <bits/stdc++.h>
using namespace std;
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()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
constrBIT();
while(m--) {
scanf("%d", &op);
if(op == 0)
scanf("%d%d", &x, &y),
updBIT(x, y);
else if(op == 1)
scanf("%d%d", &x, &y),
printf("%d\n", query(y) - query(x - 1));
else scanf("%d", &x), printf("%d\n", query2(x));
}
return 0;
}