Pagini recente » Cod sursa (job #1528579) | Cod sursa (job #1706418) | Istoria paginii fmi-no-stress-4/solutii/camionas | Istoria paginii runda/03.05/clasament | Cod sursa (job #974821)
Cod sursa(job #974821)
#include<fstream>
#define NM 100100
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,A[NM],i,t,x,a,b,k;
int sum(int st,int dr);
void update(int poz,int x);
int find(int x);
int main ()
{
f>>n>>m;
for(i=1;i<=n;++i)
{
f>>x;
update(i,x);
}
for(i=1;i<=m;++i)
{
f>>t;
if(t==0)
{
f>>a>>b;
update(a,b);
}
else
if(t==1)
{
f>>a>>b;
g<<sum(a,b)<<"\n";
}
else
{
f>>a;
g<<find(a)<<"\n";
}
}
return 0;
}
void update(int poz,int x)
{
int t;
while(poz<=n)
{
A[poz]+=x;
t=1;
while(!(poz&t)) t<<=1;
poz+=t;
}
}
int sum(int st,int dr)
{
int S=0,t;
while(dr>=1)
{
S+=A[dr];
t=1;
while(!(dr&t))t<<=1;
dr-=t;
}
st--;
while(st>=1)
{
S-=A[st];
t=1;
while(!(st&t))t<<=1;
st-=t;
}
return S;
}
int find(int x)
{
int t;
t=1;
for(;t<=n;t<<=1);
for(k=0;t;t>>=1)
{
if(k+t<=n)
{
if(x>=A[k+t])
{
k+=t,x-=A[k];
if(!x) return k;
}
}
}
return -1;
}