Pagini recente » Cod sursa (job #288126) | Cod sursa (job #445661) | Cod sursa (job #2118449) | Cod sursa (job #2369163) | Cod sursa (job #2818562)
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAXN 100000
int aib[MAXN + 1], v[MAXN + 1];
int lsb(int a){
return (a & (-a));
}
int query(int poz){
int s;
s = 0;
while(0 < poz){
s += aib[poz];
poz -= lsb(poz);
}
return s;
}
void update(int poz, int add, int n){
while(poz <= n){
aib[poz] += add;
poz += lsb(poz);
}
}
int cautare(int e, int n){
int min, max, mij;
min = 1;
max = n + 1;
while((max - min) > 1){
mij = (min + max) / 2;
if(e < query(mij)){
max = mij;
}else{
min = mij;
}
}
return min;
}
int verif(int i, int b){
if(query(i) == b){
return i;
}else{
return -1;
}
}
int main()
{
FILE *fin, *fout;
int n, q, i, op, a, b;
fin = fopen("aib.in", "r");
fscanf(fin, "%d%d", &n, &q);
for(i = 1; i <= n; i++){
fscanf(fin, "%d", &v[i]);
}
for(i = 1; i <= n; i++){
aib[i] += v[i];
if((i + lsb(i)) <= n){
aib[i + lsb(i)] += aib[i];
}
}
fout = fopen("aib.out", "w");
for(i = 0; i < q; i++){
fscanf(fin, "%d", &op);
if(op == 0){
fscanf(fin, "%d%d", &a, &b);
update(a, b, n);
v[a] += b;
}else if(op == 1){
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", query(b) - query(a - 1));
}else{
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", verif(cautare(a, n), a));
}
}
fclose(fin);
fclose(fout);
return 0;
}