Pagini recente » Cod sursa (job #1906742) | Cod sursa (job #1982752) | Cod sursa (job #1927265) | Cod sursa (job #682295) | Cod sursa (job #2643884)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
long long lsb(long long x)
{
return x&-x;
}
long long n,aib[100001];
void upd(long long poz,long long val)
{
for(; poz<=n; poz+=lsb(poz))
aib[poz]+=val;
}
long long ans(long long poz)
{
long long sum=0;
for(; poz>0; poz-=lsb(poz))
sum+=aib[poz];
return sum;
}
long long cautbin(long long poz)
{
long long r=0,pas=1<<16,sum=0;
while(pas)
{
if(r+pas<=n&&sum+aib[r+pas]<=poz)
{
r+=pas;
sum+=aib[r];
}
pas/=2;
}
if(sum==poz)
return r;
else
return -1;
}
int main()
{
long long m,i,a,b,t;
in>>n>>m;
for(i=1; i<=n; i++)
{
in>>a;
upd(i,a);
}
for(i=1; i<=m; i++)
{
in>>t;
if(t==0)
{
in>>a>>b;
upd(a,b);
}
else if(t==1)
{
in>>a>>b;
out<<ans(b)-ans(a-1)<<'\n';
}
else
{
in>>a;
out<<cautbin(a)<<'\n';;
}
}
return 0;
}