Pagini recente » Arhiva de probleme | Profil Y.Malmsteen | Rating Vochescu Alexandru (valex) | Diferente pentru arhiva intre reviziile 63 si 32 | Cod sursa (job #3293079)
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
long long aib[100005],n;
void update(int poz, int val)
{
for(int i=poz;i<=n;i+=(i&-i))
aib[i]+=val;
}
int query(int poz)
{
int s=0;
for(int i=poz;i>0;i-=(i&-i))
s+=aib[i];
return s;
}
int main()
{
int q,p;
f>>n>>q;
for(int i=1;i<=n;i++)
{
int x;
f>>x;
update(i,x);
}
p=log2(n);
while(q--)
{
int a,b,c;
f>>c;
if(c==0)
{
f>>a>>b;
update(a,b);
}
else if(c==1)
{
f>>a>>b;
g<<query(b)-query(a-1)<<'\n';
}
else
{
f>>a;
long long ind=0, s=0;
for(int i=1<<p;i>0;i>>=1)
if(ind+i<=n&&aib[ind+i]+s<=a)
{
s+=aib[ind+i];
ind+=i;
}
if(s==a)
g<<ind<<'\n';
else
g<<-1<<'\n';
}
}
}