Pagini recente » Cod sursa (job #3268867) | Cod sursa (job #2194348) | Cod sursa (job #3266294) | Cod sursa (job #1047608) | Cod sursa (job #680332)
Cod sursa(job #680332)
#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) 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 makeaib(FILE *f)
{
int x,y;
fscanf (f,"%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
fscanf (f,"%d",&y);
x=i+(i&(-i));
aib[i]+=y;
if (x<=n) aib[x]+=aib[i];
}
}
void solve (FILE *f)
{
int i,j,x,y,tip;
FILE *g=fopen ("aib.out","w");
for (i=1;i<=m;i++)
{
fscanf (f,"%d",&tip);
switch (tip)
{
case 0 : { fscanf (f,"%d%d",&x,&y); update (x,y); break ; }
case 1 : { fscanf (f,"%d%d",&x,&y); fprintf (g,"%d\n",query1 (x,y )) ; break ; }
case 2 : {fscanf (f,"%d",&x); fprintf (g,"%d\n",query2(x)); break ; }
}
}
fclose(g);
}
int main ()
{
FILE *f=fopen ("aib.in","r");
makeaib(f);
solve(f);
fclose(f);
return 0;
}