Pagini recente » Cod sursa (job #3167753) | Diferente pentru problema/fences intre reviziile 8 si 7 | Cod sursa (job #1447343) | Cod sursa (job #2044130) | Cod sursa (job #2307098)
/* Fenwick Trees
- provides effiecient methods for manipulation
of the prefix sums of a dynamic array of integer values
MODE 1
------
Point Update Range Querry
MODE 2
------
Range Update. Point Querry
MODE 3
------
Range Update. Range Querry ~
Segment Tree with Lazy Update
*/
#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e5+2;
const int Log = 18;
int n, m;
long long bit[maxN];
int lsb(int x){
return x&(-x);
}
void point_update(int pos, int value) {
for(; pos <= n; pos += lsb(pos))
bit[pos] += 1LL*value;
}
long long point_query(int pos) {
long long ans = 0;
for(; pos > 0; pos -= lsb(pos))
ans += bit[pos];
return ans;
}
int binary_lift(long long sumQ){
long long sum = 0;
int pos = 0;
for (int i = Log; i >= 0; i--) {
int offset = (1 << i);
if(pos + offset <= n && sum + bit[pos + offset] < sumQ)
pos += offset, sum += bit[pos];
}
return point_query(pos+1) == sumQ ? pos + 1 : -1;
}
int main(){
freopen("aib.int", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++ i) {
int value;
scanf("%d", &value);
point_update(i, value);
}
for(; m > 0; -- m) {
int qType;
scanf("%d", &qType);
if(qType == 0) {
int pos, updVal;
scanf("%d %d", &pos, &updVal);
point_update(pos, updVal);
}
if(qType == 1) {
int left, right;
scanf("%d %d", &left, &right);
printf("%lld\n", point_query(right) - point_query(left-1));
}
if(qType == 2) {
long long sumQ;
scanf("%lld", &sumQ);
printf("%d\n", binary_lift(sumQ));
}
}
return 0;
}