Pagini recente » Cod sursa (job #2328357) | Cod sursa (job #2568483) | Cod sursa (job #3197867) | Cod sursa (job #1098248) | Cod sursa (job #2574457)
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int len(int x)
{
return (x-(x&(x-1)));
}
int s[100001],v[100001],n;
int q1(int a,int b)
{
a--;
int s1=0,s2=0;
while(a>0)
{
s1+=s[a];
a-=len(a);
}
while(b>0)
{
s2+=s[b];
b-=len(b);
}
return s2-s1;
}
int q2(int a)
{
if(a==0) return -1;
int rz=0,pas=1<<20;
while(pas>0)
{
if(rz+pas<=n&&s[rz+pas]<=a)
rz+=pas,a-=s[rz];
pas/=2;
}
if(a==0)
return rz;
return -1;
}
int main()
{
int m,i,j,l,op,a,b;
in>>n>>m;
for(i=1;i<=n;i++)
{
in>>v[i];
}
s[1]=v[1];
for(i=2;i<=n;i++)
{
l=len(i);
l--;
s[i]=v[i];
j=i-1;
while(l>0)
{
s[i]+=s[j];
l-=len(j);
j-=len(j);
}
}
for(;m>0;m--)
{
in>>op;
if(op==0)
{
in>>a>>b;
while(a<=n)
{
s[a]+=b;
a+=len(a);
}
}
if(op==1)
{
in>>a>>b;
out<<q1(a,b)<<'\n';
}
if(op==2)
{
in>>a;
out<<q2(a)<<'\n';
}
}
return 0;
}