Pagini recente » Cod sursa (job #2095971) | Cod sursa (job #3212091) | Cod sursa (job #2763166) | Cod sursa (job #3264424) | Cod sursa (job #680387)
Cod sursa(job #680387)
#include<time.h>
#include <iostream>
#include <fstream>
using namespace std;
int n,m,aib[100005];
inline int query2 (int x )
{
int i,s=0,poz=0;
for (i=1;i<=(n>>1);i<<=1);
for (;i>0;i>>=1)
if (poz+i<=n && x>=s+aib[poz+i]) { poz+=i; s+=aib[poz]; }
if (s!=x || s==0) return -1;
return poz;
}
inline int query1 ( int x, int y )
{
int s=0;
--x;
for (;x>0;x-=(x&(-x)))
s-=aib[x];
for (;y>0;y-=y&(-y))
s+=aib[y];
return s;
}
inline void update (int poz, int val )
{
for (;poz<=n;poz+=poz&(-poz))
aib[poz]+=val;
}
void solve ()
{
int i,j,x,y,tip;
ifstream f("aib.in");
f>>n>>m;
for (int i=1;i<=n;i++)
{
f>>y;
x=i+(i&(-i));
aib[i]+=y;
if (x<=n) aib[x]+=aib[i];
}
FILE *g=fopen ("aib.out","w");
for (i=1;i<=m;i++)
{
f>>tip;
switch (tip)
{
case 0 : { f>>x>>y; update (x,y); break ; }
case 1 : { f>>x>>y; fprintf (g,"%d\n",query1 (x,y )) ; break ; }
case 2 : { f>>x; fprintf (g,"%d\n",query2(x)); break ; }
}
}
fclose(g);
f.close();
}
int main ()
{
solve();
return 0;
}