Pagini recente » Cod sursa (job #1172876) | Cod sursa (job #131879) | Cod sursa (job #360950) | Arhiva de probleme | Cod sursa (job #1329740)
#include <fstream>
#define DIM 100001
using namespace std;
int n, m, tip, op, val, p, p1, p2;
int arb[100001];
void update(int x, int nr)
{
int nr0=0;
while(x<=n)
{
nr0=0;
arb[x]+=nr;
while(! (x&(1<<nr0)) ) nr0++;
x+=(1<<nr0);
}
}
int calc(int x)
{
int nr0=0, sum=0;
while(x>0)
{
nr0=0;
sum+=arb[x];
while( !(x&(1<<nr0))) nr0++;
x-=(1<<nr0);
}
return sum;
}
int look_for(int nr)
{
int x=1;
while(x < n )
{
x <<= 1;
}
int i=0;
while( x )
{
if( i+x <= n)
{
if(arb[i+x] <= nr)
{
i+=x;
nr-=arb[i];
if(!nr) return i;
}
}
x >>= 1;
}
if( nr ) return -1;
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
in>>n>>op;
for(int i=1; i<=n; ++i)
{
in>>val;
update(i, val);
}
for(int i=1; i<=op; ++i)
{
in>>tip;
if(!tip)
{
in>>p>>val;
update(p, val);
}
else if(tip==1)
{
in>>p1>>p2;
out<<calc(p2)-calc(p1-1)<<"\n";
}
else
{
in>>val;
out<<look_for(val)<<"\n";
}
}
in.close();
out.close();
return 0;
}