Pagini recente » Cod sursa (job #1210591) | Cod sursa (job #1025897) | Cod sursa (job #1956567) | Cod sursa (job #1210477) | Cod sursa (job #2444004)
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
class fenwickTree
{
private:
#define uint unsigned int
#define lsb(x) (x)&(-x)
#define swp(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
#define BIT_CHECK_CREATED(ret) if (!created) return ret
#define BIT_ERROR 2147483647
int *tree;
bool created;
uint n;
void updatee(uint poz, int add)
{
for (;poz<=n;poz+=lsb(poz))
tree[poz]+=add;
}
int queryy(uint poz)
{
int ret=0;
for (;poz;poz-=lsb(poz))
ret+=tree[poz];
return ret;
}
public:
fenwickTree():tree(nullptr), created(false) {}
bool create(uint sz)
{
if (created) return false;
tree = new int[sz + 2];
if (tree == nullptr) return false;
n = sz + 2;
for (uint i=0;i<n;++i) tree[i] = 0;
created = true;
return true;
}
bool update(uint poz, int add)
{
BIT_CHECK_CREATED(false);
if (poz >= n) return false;
updatee(poz, add);
return true;
}
int query(uint poz)
{
BIT_CHECK_CREATED(BIT_ERROR);
if (poz >= n) return BIT_ERROR;
return queryy(poz);
}
int query(uint left, uint right)
{
BIT_CHECK_CREATED(BIT_ERROR);
if (left > right) swp(left, right);
if (right >= n) return BIT_ERROR;
return queryy(right) - queryy(left-1);
}
};
int n, m, t, x, y;
int op3(int val, fenwickTree *tree)
{
int st = 1, dr = n, mid, v;
while (st<=dr)
{
mid = (st + dr)/2;
v = tree->query(mid);
if (v == val) return mid;
if (v > val) dr = mid-1;
else st = mid+1;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
fenwickTree tree;
tree.create(n);
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
tree.update(i,x);
}
for (int i=1;i<=m;++i)
{
scanf("%d %d",&t,&x);
if (t == 0) {scanf("%d",&y); tree.update(x,y);}
else if (t == 1) {scanf("%d",&y); printf("%d\n", tree.query(x,y));}
else printf("%d\n", op3(x, &tree));
}
return 0;
}