Pagini recente » Cod sursa (job #704473) | Cod sursa (job #1841629) | Cod sursa (job #656524) | Cod sursa (job #1658185) | Cod sursa (job #2329542)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define limn 100010
int n,m;
int vaib[limn];
void add(int poz, int val)
{
for(; poz<=n; poz+=(poz&(-poz)))
vaib[poz]+=val;
}
int query(int poz)
{
int val=0;
for(; poz>=1; poz-=(poz&(-poz)))
val+=vaib[poz];
return val;
}
int pozmin(int val)
{
int mask, poz;
for(mask=1; mask<=n; mask<<=1);
mask>>=1;
for(poz=0; mask; mask>>=1)
if(poz+mask<=n)
if(vaib[poz+mask]<=val)
{
val-=vaib[poz+mask];
poz+=mask;
if(!val) return poz;
}
return -1;
}
int main()
{
int x,j,q,a,b;
fin>>n>>m;
for(int i=1; i<=n; i++)
{
fin>>x;
for(j=i; j<=n; j+=(j&(-j)))
vaib[j]+=x;
}
while(m--)
{
fin>>q;
if(q==0)
{
fin>>a>>b;
add(a,b);
}
else if(q==1)
{
fin>>a>>b;
fout<<query(b)-query(a-1)<<'\n';
}
else if(q==2)
{
fin>>a;
fout<<pozmin(a)<<'\n';
}
}
fin.close();
fout.close();
return 0;
}