Pagini recente » Cod sursa (job #2477291) | Cod sursa (job #570815) | Cod sursa (job #2790115) | Cod sursa (job #714206) | Cod sursa (job #293031)
Cod sursa(job #293031)
#include<fstream>
using namespace std;
int v[100010],m,n,i,j,poz,x,st,dr,op;
int minim (int a,int b)
{ if(a<b) return a;
return b;
}
void update(int poz,int val)
{ int k=0;
while(poz<=n)
{v[poz]+=val;
while(!(poz&(1<<k))) k++;
poz+=(1<<k);
k++;
}
}
int query (int poz)
{ int k=0,s=0;
while(poz>0)
{ s+=v[poz];
while(!(poz&(1<<k))) k++;
poz-=(1<<k);
k++;
}
return s;
}
int search(int val)
{
int i,step;
for (step=1;step<n;step<<=1);
for(i=0;step;step>>=1)
{
if(i+step<=n)
{
if(val>=v[i+step])
{
i+=step,val-=v[i];
if(!val) return i;
}
}
}
return -1;
}
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;
for(i=1;i<=n;i++)
{ f>>x; update(i,x);}
for(i=1;i<=m;i++)
{ f>>op;
if(!op) { f>>poz>>x; update(poz,x);}
else if(op==1)
{ f>>st>>dr;
g<<query(dr)-query(st-1)<<'\n';}
else {f>>x; g<<search(x)<<'\n';}
}
f.close();
g.close();
return 0;
}