Pagini recente » Cod sursa (job #1490356) | Cod sursa (job #1094667) | Cod sursa (job #2255200) | Cod sursa (job #2756021) | Cod sursa (job #3231531)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define VI vector<int>
VI sir, aib;
int N, M;
void update(int idx, int val) {
for (int i = idx; i <= N; i += i & -i) {
aib[i] += val;
}
}
int sum(int idx) {
int suma = 0;
for (int i = idx; i >= 1; i -= i & -i) {
suma += aib[i];
}
return suma;
}
int cautare(int val) {
int i, step;
for ( step = 1; step < N; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= N)
{
if( val >= aib[i+step] )
{
i += step, val -= aib[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main() {
fin >> N >> M;
sir = aib = VI(N + 1, 0);
for (int i = 1; i <= N; ++i) {
fin >> sir[i];
update(i, sir[i]);
}
for (int i = 0; i < M; ++i) {
int op;
fin >> op;
if (op < 2) {
int idx, val;
fin >> idx >> val;
if (op == 0) {
update(idx, val);
} else {
fout << sum(val) - sum(idx - 1) << '\n';
}
} else {
int val;
fin >> val;
fout << cautare(val) << '\n';
}
}
}