Pagini recente » Cod sursa (job #2221058) | Cod sursa (job #1963657) | Cod sursa (job #3183608) | Cod sursa (job #731345) | Cod sursa (job #855359)
Cod sursa(job #855359)
#include <fstream>
#include <string.h>
#include <stdlib.h>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int N,M,*A,*buck,nobk,bksize;
int rad(int x)
{
int i=1;
while (i*i<=x) i++;
return i-1;
}
void pay(int T,int val) //achitat valoare V in ziua T
{
A[T]-=val;
if (T<nobk*bksize)
buck[T/bksize]-=val;
}
int query(int P,int Q)
{
int i,sum=0;
while ((Q>=0)&&(Q%bksize!=bksize-1))
{sum+=A[Q];Q--;}
if (P!=Q)
while ((P<N)&&(P%bksize!=0)) {sum+=A[P];P++;}
for (i=(P/bksize);i<=(Q/bksize);i++)
sum+=buck[i];
return sum;
}
int main()
{
int i,a,b,sum,op;
f>>N>>M;
A=(int*)malloc(sizeof(int)*(N+1));
for (i=0;i<N;i++)
f>>A[i];
bksize=rad(N);
nobk=N/bksize;
buck=(int*)malloc(sizeof(int)*(nobk+1));
for (i=0;i<nobk;i++) buck[i]=0;
for (i=0;i<N;i++)
buck[i/bksize]+=A[i];
for (i=1;i<=M;i++)
{
f>>op>>a>>b;
switch (op)
{
case 0:
pay(a-1,b);
break;
case 1:
sum=query(a-1,b-1);
g<<sum<<"\n";
break;
}
}
/*
g<<"\n";
for (i=0;i<nobk;i++)
g<<buck[i]<<" ";
g<<"\n";
for (i=0;i<N;i++)
g<<A[i]<<" ";*/
return 0;
}