Pagini recente » Cod sursa (job #2816454) | Cod sursa (job #1504884) | Cod sursa (job #27101) | Cod sursa (job #366354) | Cod sursa (job #2308717)
#include <fstream>
#define last(x) (x & -x)
using namespace std;
typedef long long ll;
ll aib[100001];
int n;
void adaug(int i,ll z)
{
for(int index=i;index<=n;index+=last(index))
aib[index]+=z;
}
ll suma(int a)
{
ll rez;
for(rez=0;a;a-=last(a))
rez+=aib[a];
return rez;
}
int poz(ll s)
{
int i=1,j=n;
while(i<=j)
{
int m=(i+j)/2;
ll csum=suma(m);
if(csum==s)
return m;
else
if(s<csum)
j=m-1;
else
i=m+1;
}
return -1;
}
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
int m;
f>>n>>m;
for(int i=1;i<=n;i++)
{
int a;
f>>a;
adaug(i,a);
}
for(int i=1;i<=m;i++)
{
int t,a,b;
f>>t>>a;
if(t!=2)
f>>b;
switch(t)
{
case 0:
adaug(a,b);
break;
case 1:
g<<suma(b)-suma(a-1)<<'\n';
break;
case 2:
g<<poz(a)<<'\n';
}
}
f.close();
g.close();
return 0;
}