Pagini recente » Sandwich | Cod sursa (job #2465484) | Cod sursa (job #609928) | Cod sursa (job #409720) | Cod sursa (job #2209441)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,aib[100005],i,a,b,cnt;
void add(int,int);
int suma(int),cautare(int);
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
f>>aib[i];
for(;m;m--)
{
f>>cnt;
if(cnt==0)
{
f>>a>>b;
add(a,b);
}
else
{if(cnt==1)
{
f>>a>>b;
g<<suma(b)-suma(a-1)<<"\n";
}
else
{
f>>a;
//cautare binara,incadrez a intre 2 val si verific daca am egalitate,daca nu afisez -1
cautare(a);
g<<"\n";
}
}
}
return 0;
}
void add(int p,int v)
{
for(;p<=n;p+=(p&(-p)))
aib[p]=v;
}
int suma(int p)
{
int ret=0;
for(;p;p-=(p&(-p)))
ret+=aib[p];
return ret;
}
int cautare(int a)
{
int poz = n+1, mi;
int st=0, dr=n+1;
mi = n;
int S = suma(mi);
if ( S == a ) poz = n;
while ( mi )
{
mi = (st+dr)>>1;
S = suma(mi);
if ( S > a )
{
if ( dr > mi )
dr = mi;
mi --;
}
else
if ( S == a )
{poz = min(poz,mi);
dr = mi;
mi --;}
else
{
if ( st < mi )
st = mi;
mi ++;
}
if ( mi <= st ) break;
if ( mi >= dr ) break;
}
if ( poz == n+1 ) return -1;
return poz;
}