Pagini recente » Cod sursa (job #1766850) | Cod sursa (job #1981530) | Cod sursa (job #62330) | Cod sursa (job #2282855) | Cod sursa (job #2604347)
#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,interval=1;
while(interval<n)interval*=2;
while(interval)
{
if(aib[idx+interval]<=val && idx+interval<=n)
{
val-=aib[idx+interval];
idx+=interval;
}
interval/=2;
}
if(idx==0)return -1;
return idx;
}
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;
}