Pagini recente » Atasamentele paginii Clasament judet9-1 | Cod sursa (job #2544056) | Atasamentele paginii booyaaaaaaaa | Cod sursa (job #2467869) | Cod sursa (job #2499705)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
long a[100010];
int highestPowerOf2(int n) {
int pow = 1;
while (pow <= n) {
pow *= 2;
}
return pow / 2;
}
void update(int p, int v) {
for (int i = p; i <= n; i += i & -i) {
a[i] += v;
}
}
long query(int p) {
long s = 0;
for (int i = p; i > 0; i -= i & -i) {
s += a[i];
}
return s;
}
int Search(int Sum)
{
int pos = n+1, B;
int limst=0, limdr=n+1;
B = n;
int S = query(B);
if ( S == Sum ) pos = n;
while ( B )
{
B = (limst+limdr)>>1;
S = query(B);
if ( S > Sum )
{
if ( limdr > B ) limdr = B;
B -= 1;
}
else if ( S == Sum ) pos = min(pos,B), limdr = B, B -= 1;
else
{
if ( limst < B ) limst = B;
B += 1;
}
if ( B <= limst ) break;
if ( B >= limdr ) break;
}
if ( pos == n+1 ) return -1;
return pos;
}
void citire() {
fin >> n >> m;
int val;
for (int i = 1; i <= n; ++i) {
fin >> val;
update(i, val);
}
}
int main()
{
citire();
int c;
long x, y;
for (int i = 1; i <= m; ++i) {
fin >> c >> x;
if (c == 0) {
fin >> y;
update(x, y);
}
else if (c == 1) {
fin >> y;
fout << query(y) - query(x - 1) << "\n";
}
else {
fout << Search(x) << "\n";
}
}
return 0;
}