Pagini recente » Cod sursa (job #2357513) | Cod sursa (job #1104931) | Cod sursa (job #1394207) | Cod sursa (job #2838041) | Cod sursa (job #3176441)
#include <stdio.h>
#include <iostream>
#define N_MAX 100001
#define N_LOG 20
using namespace std;
long long n, m, arr[N_MAX];
long long aib[N_MAX];
int leastSignificantBit (int x){
return x & (-x);
}
void build (){
for (int i=1; i<=n; ++i){
aib[i] += arr[i];
if (i + leastSignificantBit(i) <= n)
aib[i + leastSignificantBit(i)] += aib[i];
}
}
void update (int idx, int value){
arr[idx] = value;
while (idx <= n){
aib[idx] += value;
idx += leastSignificantBit(idx);
}
}
long long query (int Idx){
long long Sum = 0;
while (Idx){
Sum += aib[Idx];
Idx -= leastSignificantBit(Idx);
}
return Sum;
}
int binaryLifting (unsigned long long value){
long long mask, pos;
unsigned long long sum;
pos = 0;
sum = 0;
mask = 1 << N_LOG;
while (mask){
if (pos + mask <= n && sum + aib[pos+mask] <= value){
sum += aib[pos+mask];
pos += mask;
}
mask >>= 1;
}
if (sum == value)
return pos;
return -1;
}
int main (){
FILE *in, *out;
in = fopen ("aib.in", "r");
out = fopen ("aib.out", "w");
fscanf(in, "%lld%lld", &n, &m);
for (int i=1; i<=n; ++i)
fscanf (in, "%lld", &arr[i]);
build();
int op, y, x;
for (int i=1; i<=m; ++i){
fscanf(in, "%d", &op);
if (op == 0){
fscanf(in, "%d%d", &x, &y);
update(x, y);
}
else if (op == 1){
fscanf(in, "%d%d", &x, &y);
fprintf (out, "%lld \n", query(y) - query(x-1));
}
else{
unsigned long long a;
fscanf(in, "%ulld", &a);
fprintf(out, "%d \n", binaryLifting(x));
}
}
return 0;
}