Pagini recente » Cod sursa (job #1167640) | Cod sursa (job #2325348) | Cod sursa (job #2210310) | Cod sursa (job #882850) | Cod sursa (job #2046471)
#include<fstream>
#include<vector>
#include<queue>
#define DN 300005
#include<iostream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int a[DN],n,m,t,s[DN],b,type,x,y,v;
void actualizare(int x,int y)
{
a[x]+=y;
/* for(int i=0;i<=18;i++)
if(!((1<<i)&5))
cout<<0;
else
cout<<1;
cout<<'\n';
for(int i=0;i<=18;i++)
if(!((1<<i)&6))
cout<<0;
else
cout<<1;
cout<<'\n';*/
for(int i=1;i<=18;i++)
if(!((1<<i)&x))
{
v=0;
for(int j=18;j>i;j--)
if((1<<j)&x)
v=v*2+1;
else
v*=2;
v=v*2+1;
for(int j=i-1;j>=0;j--)
v*=2;
//cout<<v<<'\n';
a[v]+=y;
}
}
int suma(int x)
{
int s=0,poz=0;
for(int i=18;i>=0&&poz<=x;i--)
if(poz+(1<<i)<=x)
{
poz+=(1<<i);
s+=a[poz];
}
return s;
}
int pozmin(int x)
{
int poz=0,s=0,c;
for(int i=18;i>=0;i--)
{
c=poz+(1<<i);
// cout<<a[c]<<'\n';
if(s+a[c]<=x&&c<=n)
{
poz=c;
s=s+a[c];
//cout<<poz<<'\n';
if(s==x)
break;
}
}
//cout<<s<<'\n';
if(s!=x)
poz=-1;
return poz;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>t;
s[i]=s[i-1]+t;
for(int j=0;j<=18;j++)
if(i%(1<<j)==0)
b=(1<<j);
else
break;
a[i]=s[i]-s[i-b];
}
for(int i=1;i<=m;i++)
{
fin>>type;
if(type==0)
{
fin>>x>>y;
actualizare(x,y);
}
if(type==1)
{
fin>>x>>y;
fout<<suma(y)-suma(x-1)<<'\n';
}
if(type==2)
{
fin>>x;
fout<<pozmin(x)<<'\n';
}
}
}