Pagini recente » Cod sursa (job #138976) | Cod sursa (job #1719440) | Cod sursa (job #956846) | Cod sursa (job #2531393) | Cod sursa (job #2018197)
#include <fstream>
#define DIM 1<<17
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int AIB[DIM];
int n,m;
int lsb(int x)
{
return (x^(x-1))&x;
}
void update(int p,int v)
{
for(int i=p;i<=n;i+=lsb(i))
AIB[i]+=v;
}
int query(int p)
{
int rez=0;
for(int i=p;i>0;i-=lsb(i))
rez+=AIB[i];
return rez;
}
int cauta(int s)
{
int p=0;
for(int i=DIM;i>0;i>>=1)
if(p+i<=n&&AIB[p+i]<=s)
s-=AIB[p+i],p+=i;
if(s==0&&p!=0)
return p;
else
return -1;
}
int main()
{
fi>>n>>m;
for(int i=1;i<=n;i++)
{
int a;
fi>>a;
update(i,a);
}
for(int i=1;i<=m;i++)
{
int tip;
fi>>tip;
if(tip==0)
{
int a,b;
fi>>a>>b;
update(a,b);
}
else if(tip==1)
{
int a,b;
fi>>a>>b;
fo<<query(b)-query(a-1)<<"\n";
}
else
{
int a;
fi>>a;
fo<<cauta(a)<<"\n";
}
}
fi.close();
fo.close();
return 0;
}