Pagini recente » Cod sursa (job #2101977) | Cod sursa (job #2138677) | Cod sursa (job #125133) | Cod sursa (job #591580) | Cod sursa (job #3180650)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int Nmax=100001;
int aib[Nmax],n;
int getP2min(int x)
{
return (x&(-x));
}
void addAIB(int pos, int val)
{
while(pos<=n)
{
aib[pos]+=val;
pos+=getP2min(pos);
}
}
long long sumAIB(int pos)
{
long long rez=0;
while(pos!=0)
{
rez+=aib[pos];
pos-=getP2min(pos);
}
return rez;
}
int pos_minAIB(long long s)
{
int pas=1<<16,pos=0;
long long cs=s;
while(pas!=0)
{
if(pos+pas<=n && aib[pos+pas]<s)
{
s-=aib[pos+pas];
pos+=pas;
}
pas/=2;
}
if(pos<n && sumAIB(pos+1)==cs)
{
return pos+1;
}
return -1;
}
int main()
{
int m;
fin>>n>>m;
for(int i=1; i<=n; i++)
{
int val;
fin>>val;
addAIB(i, val);
}
for(int i=1; i<=m; i++)
{
int t;
fin>>t;
if(t==0)
{
int pos,val;
fin>>pos>>val;
addAIB(pos, val);
}
else if(t==1)
{
int st,dr;
fin>>st>>dr;
fout<<sumAIB(dr)-sumAIB(st-1)<<'\n';
}
else
{
long long s;
fin>>s;
fout<<pos_minAIB(s)<<'\n';
}
}
return 0;
}