Pagini recente » Cod sursa (job #756393) | Cod sursa (job #1458362) | Cod sursa (job #2180322) | Cod sursa (job #165820) | Cod sursa (job #2604350)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int nmax=100005;
int n,m,v[nmax],aib[nmax];
void update(int poz,int val)
{
for(int i=poz;i<=n;i+= i & -i)
aib[i]+=val;
}
int query(int poz)
{
int sum=0;
for(;poz>0;poz-= poz & -poz)
sum+=aib[poz];
return sum;
}
int bs(int val)
{
int idx=0,interv;
for(interv=1;interv<n;interv*=2);
for(;interv>0;interv/=2)
if(idx+interv<=n)
if(aib[idx+interv]<=val)
{
idx+=interv;
val-=aib[idx];
if(!val)return idx;
}
return -1;
}
void read()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>v[i];
update(i,v[i]);
}
for(int i=1;i<=m;i++)
{
int op,a,b;
fin>>op;
if(op<=1)fin>>a>>b;
else fin>>a;
if(!op)update(a,b);
else if(!(--op))fout<<query(b)-query(a-1)<<"\n";
else fout<<bs(a)<<"\n";
}
}
int main()
{
read();
return 0;
}