Pagini recente » Monitorul de evaluare | Cod sursa (job #922797) | Cod sursa (job #1565871) | Cod sursa (job #13580) | Cod sursa (job #1145820)
#include <fstream>
#include <vector>
using namespace std;
int n,m;
vector<int> arb;
void modificare(int poz,int val)
{
int k=0;
while(poz<=n)
{
arb[poz] += val;
while(!(poz & (1<<k)))
k++;
poz += (1<<k);
k++;
}
}
long long suma(int poz)
{
int k=0;
long long s=0;
while(poz>0)
{
s += arb[poz];
while ( !(poz & (1<<k)) )
k++;
poz -= (1<<k);
k++;
}
return s;
}
int Cautare(int val)
{
int pas;
for ( pas = 1; pas < n; pas <<= 1 );
for(int i = 0; pas; pas >>= 1 )
{
if( i + pas <= n)
{
if( val >= arb[i+pas] )
{
i += pas, val -= arb[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main()
{
int t,a,b;
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;
arb.resize(n+1,0);
for(int i=1;i<=n;i++)
{
f>>a;
modificare(i,a);
}
for(int i=1;i<=m;i++)
{
f>>t;
switch(t)
{
case 0:
{
f>>a>>b;
modificare(a,b);
break;
};
case 1:
{
f>>a>>b;
g<<suma(b)-suma(a-1)<<"\n";
break;
};
case 2:
{
f>>a;
g<<Cautare(a)<<"\n";
break;
}
}
}
return 0;
}