Pagini recente » Cod sursa (job #2356743) | Monitorul de evaluare | Cod sursa (job #578730) | Istoria paginii runda/lh.11-1/clasament | Cod sursa (job #2019599)
#include <fstream>
#define ub(x) (x&(-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,a[100005],aib[100005],k,z,v,t;
void update(int poz,int val)
{
for(int i=poz;i<=n;i=i+ub(i))
{
aib[i]=aib[i]+val;
}
}
int sum(int poz)
{
int s=0;
for(int i=poz;i>0;i=i-ub(i))
{
s=s+aib[i];
}
return s;
}
int doi(int nr)
{
int st,dr,mij;
st=1;
dr=n;
while(st<=dr)
{
mij=(st+dr)/2;
if(sum(mij)==nr) return mij;
else if(sum(mij)<nr) st=mij+1;
else dr=mij-1;
}
return -1;
}
int main()
{
int i;
f>>n>>k;
for(i=1;i<=n;i++)
{
f>>a[i];
update(i,a[i]);
}
for(i=1;i<=k;i++)
{
f>>z;
if(z==0) {f>>v>>t;update(v,t);}
else if(z==1) {f>>v>>t;g<<sum(t)-sum(v-1)<<'\n';}
else
{
f>>v;
g<<doi(v)<<'\n';
}
}
return 0;
}