Pagini recente » Cod sursa (job #3032215) | Cod sursa (job #2495859) | Cod sursa (job #2377693) | Cod sursa (job #2038255) | Cod sursa (job #2868521)
#include <iostream>
#include <fstream>
#define MAXN 100001
#define zeros(x) ((x ^ (x-1)) & x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,aib[MAXN],x,a,b,c;
void update (int cur,int val)
{
//aib[cur]=val;
for (int x=cur; x<=n; x+=zeros(x))
{
aib[x]+=val;
}
}
int sum1a (int a)
{
int sum=0;
for (int i=a; i>=1; i-=zeros(i))
{
//cout<<i<<' '<<zeros(i)<<'\n';
sum+=aib[i];
}
return sum;
}
int query (int k)
{
int li=1,ls=n,lm,save=MAXN;
while (li<=ls)
{
lm=(li+ls)/2;
if (sum1a(lm)<=k)
{
save=lm;
li=lm+1;
}
else
{
ls=lm-1;
}
}
return save;
}
/*int query (int a,int b)
{
int sum=0;
for (a; a<=b; a+=zeros(x))
{
sum+=aib[a];
}
return sum;
}
int task3query (int k)
{
int sum=0,save=0;
for (int i=1; i<=n && sum<k; i+=zeros(i))
{
save=i;
sum+=aib[i];
//cout<<i<<'\n';
}
return save;
}*/
int main()
{
f>>n>>m;
for (int i=1; i<=n; i++)
{
f>>x;
update(i,x);
}
for (int i=1; i<=m; i++)
{
f>>a>>b;
if (a==0)
{
f>>c;
update(b,c);
}
else if (a==1)
{
f>>c;
// cout<<sum1a(c)<<'\n';
//cout<<'\n';
g<<sum1a(c)-sum1a(b-1)<<'\n';
}
else
{
g<<query(b)<<'\n';
}
}
return 0;
}