Pagini recente » Cod sursa (job #2037282) | Cod sursa (job #2065263) | Cod sursa (job #3320067) | Cod sursa (job #1368327) | Cod sursa (job #3309565)
//#include <iostream>
#include <fstream>
using namespace std;
const int maxn = 1e5+5;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n, m, x, tip, a, b;
int aib[100005];
// S[3, 5] = S[1, 5] - S[1, 2]
// S[a, b] = S[1, b] - S[1, a-1]
int suma(int a, int b) {
if(a != 1)
return suma(1, b) - suma(1, a-1);
int p = 1 << 20, sumaTotala = 0, st = 0;
while(p > 0) {
if(st + p <= n && st + p <= b) {
sumaTotala += aib[st + p];
st += p;
}
p /= 2;
}
return sumaTotala;
}
int query(int a, int b) {
if(a != 1)
return suma(1, b) - suma(1, a-1);
int sumaTotala = 0;
while(b > 0) {
sumaTotala += aib[b];
// b = b & (b - 1);
b -= (b & (-b));
}
return sumaTotala;
}
void update(int pos, int val) {
while(pos <= n) {
aib[pos] += val;
// pos = 2 * pos - (pos & (pos - 1));
pos += (pos & (-pos));
}
// 5 -5
//00000101 11111011
// 00000101 &
// 11111011
// 00000001
// 4 -4
// 00000100 11111100
//
// 00000100 &
// 11111100
// 00000100
}
int query2(int a) {
int p = 1 << 20, r = 0, suma = 0, k = -1;
while(p > 0) {
if(r + p <= n && suma + aib[r + p] == a) {
k = r + p;
}
if(r + p <= n && suma + aib[r + p] < a) {
suma += aib[r + p];
r += p;
}
p /= 2;
}
// suma = cea mai mare suma < a
// r = pozitia
return k;
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) {
cin >> x;
update(i, x);
}
// for(int i = 1; i <= n; i ++) {
// cout << aib[i] << ' ';
// }
for(int i = 1; i <= m; i ++) {
cin >> tip;
if(tip == 0) {
cin >> a >> b;
update(a, b);
} else if(tip == 1) {
cin >> a >> b;
cout << query(a, b) << '\n';
} else if(tip == 2) {
cin >> a;
cout << query2(a) << '\n';
}
}
return 0;
}