Pagini recente » Cod sursa (job #3296374) | Cod sursa (job #3193580) | Cod sursa (job #2358939) | Cod sursa (job #1328583) | Cod sursa (job #2963196)
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n;
const int NMAX = 100001;
int aib[NMAX];
void update(int p, int v)
{
for (int i = p; i <= n; i += i & - i)
aib[i] += v;
}
int query(int p)
{
int sum = 0;
for (int i = p; i; i -= i & -i)
sum += aib[i];
return sum;
}
int main()
{
int m, i, x, tip, p, a, b;
cin >> n >> m;
for (i = 1; i <= n; ++i) {
cin >> x;
update(i, x);
}
for(i = 1; i <= m; ++i) {
cin >> tip;
if (tip == 0)
{
cin >> p >> x;
update(p, x);
}
else if (tip == 1)
{
cin >> a >> b;
cout << query(b) - query(a - 1) << '\n';
}
else {
cin >> x;
int st = 0, dr = n + 1;
int pos = n + 1;
int m = n;
int s = query(m);
if ( s == x ) pos = n;
while ( m )
{
m = (st + dr)>>1;
s = query(m);
if ( s > x )
{
if (dr > m ) dr = m;
m -= 1;
}
else if ( s == x ) pos = min(pos, m), dr = m, m -= 1;
else
{
if ( st < m ) st = m;
m += 1;
}
if ( m <= st ) break;
if ( m >= dr ) break;
}
if ( pos == n+1 ) cout << -1 << '\n';
else
cout << pos << '\n';
}
}
return 0;
}
/*
8 3
25 42 8 15 1 55 16 67
0 5 12
2 25
2 90
1 7 7
1 2 8
2 241
*/