Pagini recente » Borderou de evaluare (job #2621104) | Cod sursa (job #3337751)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define NMAX 100000
int aib[NMAX + 1];
int N;
int lsb(int nr){
return nr & (-nr);
}
void update(int poz, int val){
for (int i = poz; i <= N; i += lsb(i)){
aib[i] += val;
}
}
int query(int poz){
int rez = 0;
for (int i = poz; i > 0; i -= lsb(i)){
rez += aib[i];
}
return rez;
}
int cb(int k){
int pas = (1 << 20), poz = 0;
int init = k;
while (pas > 0){
if (pas + poz <= N && aib[poz + pas] <= k){
k -= aib[poz + pas];
poz += pas;
}
pas >>= 1;
}
if (poz > N || query(poz) != init){
return -1;
}
return poz;
}
int main()
{
int M;
fin >> N >> M;
for (int i = 1; i <= N; i++){
int nr;
fin >> nr;
update(i, nr);
}
for (int i = 1; i <= M; i++){
int x;
fin >> x;
if (x == 0){
int a, b;
fin >> a >> b;
update(a, b);
}
else if (x == 1){
int a, b;
fin >> a >> b;
fout << query(b) - query(a - 1) << '\n';
}
else{
int a;
fin >> a;
fout << cb(a) << '\n';
}
}
return 0;
}