Pagini recente » Cod sursa (job #1873652) | Monitorul de evaluare | Cod sursa (job #1183839) | Cod sursa (job #1747132) | Cod sursa (job #2075511)
#include<fstream>
#include<vector>
#include<queue>
#define DN 100005
#include<iostream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int a[DN],n,m,t,b,type,x,y,v;
int bit(int x)
{
return (x&(-x));
}
void actualizare(int x,int y)
{
v=x;
while(v<=n)
{
b=bit(v);
a[v]+=y;
v+=b;
}
}
int suma(int x)
{
int s=0,poz=0,t;
while(x)
{
poz+=bit(x);
t=bit(x);
// cout<<x<<' '<<poz<<'\n';
s+=a[x];
x-=bit(x);
}
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(c<=n)
if(s+a[c]<=x)
{
poz=c;
s=s+a[c];
//cout<<poz<<'\n';
if(s==x)
break;
}
}
//cout<<s<<'\n';
if(s!=x||x==0)
poz=-1;
return poz;
}
int main()
{
cout<<sizeof(a)/1000<<'\n';
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>t;
for(int j=0;j<=18;j++)
if(i%(1<<j)==0)
b=(1<<j);
else
break;
a[i]=suma(i-1)+t-suma(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';
// fout<<'x'<<'\n';
}
if(type==2)
{
fin>>x;
fout<<pozmin(x)<<'\n';
}
}
}