Pagini recente » Cod sursa (job #1699138) | Cod sursa (job #701460) | Cod sursa (job #2860412) | Cod sursa (job #36496) | Cod sursa (job #1954097)
#include <fstream>
#define v(x) ( (-x)&x )
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,a[100001],i,m,op,b,c,el;
void update(int valoare,int poz)
{
for(int i=poz;i<=n;i+=v(i)) a[i]+=valoare;
}
int query(int poz)
{
int suma=0;
for(int i=poz;i>0;i-=v(i)) suma+=a[i];
return suma;
}
int verifica(int valoare)
{
int suma;
for(suma=1;suma<n;suma<<=1) ;
for(int i=0;suma;suma>>=1)
{
if(i+suma<=n)
{
if(valoare>=a[i+suma])
{
i+=suma;
valoare-=a[i];
if(!valoare) return i;
}
}
}
return -1;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>el;
update(el,i);
}
for(i=1;i<=m;i++)
{
f>>op;
if(op==2)
{
f>>b;
g<<verifica(b)<<'\n';
}
else if(op==1)
{
f>>c>>b;
int s1=query(b);
int s2=query(c-1);
g<<s1-s2<<'\n';
}
else
{
f>>c>>b;
update(b,c);
}
}
return 0;
}