Pagini recente » Cod sursa (job #2271254) | Cod sursa (job #103121) | Cod sursa (job #1808514) | Cod sursa (job #522470) | Cod sursa (job #2337360)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int arbore[100005], n, m, s, tip;
void update_arb(int val, int poz)
{
while (poz<=n)
{
arbore[poz]+=val;
poz=poz+(poz&(-poz));
}
}
int get_sum(int ind)
{
int sum=0;
while (ind)
{
sum+=arbore[ind];
ind=ind-(ind&(-ind));
}
return sum;
}
int Search(int val)
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= n)
{
if( val >= arbore[i+step] )
{
i += step, val -= arbore[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main() {
int x;
f >> n >> m;
for (int i=1; i<=n; i++)
{
f >> x;
update_arb(x,i);
}
/*for (int i=1; i<=n; i++)
{
cout << arbore[i] <<' ';
}*/
for (int quer=0; quer<m; ++quer)
{
f >> tip;
if (tip==0)
{
int a,b;
f >> a >> b;
update_arb(b,a);
}
else if (tip==1)
{
int a, b;
f >> a >> b;
g << get_sum(b)-get_sum(a-1) << '\n';
}
else
{
f >> x;
g << Search(x) << '\n';
}
}
return 0;
}