Pagini recente » Cod sursa (job #1852784) | Cod sursa (job #337808) | Cod sursa (job #2305215) | Cod sursa (job #1125899) | Cod sursa (job #2019610)
#include <fstream>
#define ub(x) (x&(-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
long long int AIB[100005],n,m;
int i,j,poz,tip;
long long int a,b,x,mod;
void update (int poz, int val )
{
for(j=poz; j<=n; j+=ub(j))
AIB[j]+=val;
}
int sum (int poz)
{
int S=0;
for(int j=poz; j>0; j-=ub(j))
S+=AIB[j];
return S;
}
int cautare (int x)
{
int st=1;
int dr=n;
poz=0;
while(st<=dr&&!poz)
{
m=(st+dr)/2;
if(x==sum(m))
poz=m;
else if(sum(m)>x)
dr=m-1;
else st=m+1;
}
return poz;
}
int main()
{
f>>n>>mod;
for(i=1; i<=n; i++)
{
f>>x;
j=i;
update(j,x);
}
for(i=1; i<=mod; i++)
{
f>>tip;
if(tip==0)
{
f>>a>>b;
update(a,b);
}
else if(tip==1)
{
f>>a>>b;
g<<sum(b)-sum(a-1)<<'\n';
}
else if(tip==2)
{
f>>x;
if(cautare(x))
g<<cautare(x);
else g<<-1;
g<<'\n';
}
}
return 0;
}