Pagini recente » Cod sursa (job #821371) | Cod sursa (job #1451997) | Cod sursa (job #1372984) | Cod sursa (job #649294) | Cod sursa (job #2776956)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
long long n,m,sp[100010],s[100010],o,a,b;
void adaugare(long long poz,long long val)
{
for(poz=poz;poz<=n;poz+=(poz&-poz))
s[poz]+=val;
}
long long suma(long long poz)
{
long long r=0;
for(poz=poz;poz;poz-=(poz&-poz))
r+=s[poz];
return r;
}
long long cautare(long long sum)
{
long long r=0,sr=0;
while(r%2==0&&r<n&&sr<sum)
{
long long i;
for(i=1;r+i<=n&&(r==0||i<(r&-r));i<<=1)
{
if(sr+s[r+i]>sum)
{
if(i==1)
return -1;
else
{
i>>=1;
break;
}
}
}
if(i>n||i==(r&-r))
i>>=1;
r+=i;
sr+=s[r];
}
if(sr==sum)
return r;
return -1;
}
int main()
{
in>>n>>m;
for(int i=1;i<=n;++i)
{
in>>sp[i];
sp[i]+=sp[i-1];
s[i]=sp[i]-sp[i-(i&-i)];
}
for(int i=1;i<=m;++i)
{
in>>o;
if(o==0)
{
in>>a>>b;
adaugare(a,b);
}
else if(o==1)
{
in>>a>>b;
out<<suma(b)-suma(a-1)<<'\n';
}
else
{
in>>a;
out<<cautare(a)<<'\n';
}
}
return 0;
}