Pagini recente » Cod sursa (job #2408642) | Cod sursa (job #2452901) | Cod sursa (job #357887) | Cod sursa (job #1148208) | Cod sursa (job #3290574)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 1e5 + 5;
int aib[NMAX], n, m, i;
void update(int poz, int val) {
for(int i = poz; i <= n; i += (i&-i))
aib[i] += val;
}
int query(int a) {
if(!a) return 0;
int suma = 0;
for(int i = a; i > 0; i-=(i&-i))
suma+=aib[i];
return suma;
}
pair<int, int> query_max(int a) {
int poz = 0;
int sum = 0;
for (int bit = 30;bit >= 0;bit--){
if (((1 << bit) | poz) > n)
continue;
if (sum + aib[poz | (1 << bit)] <= a){
poz |= (1 << bit);
sum += aib[poz];
}
if (sum == a && poz == 0)
return {-1,-1};
}
return {poz,sum};
}
int main()
{
in >> n >> m;
for(i = 1; i <= n; ++i) {
int x;
in >> x;
update(i,x);
}
while(m--){
int t;
in >> t;
if(!t){
int a, b;
in >> a >> b;
update(a,b);
}
else if(t==1){
int a, b;
in >> a >> b;
out << query(b) - query(a-1) << '\n';
}
else {
int a;
in >> a;
pair<int, int> rez = query_max(a);
if (rez.second == a)
out << rez.first << "\n";
else
out << "-1\n";
}
}
return 0;
}