Cod sursa(job #855348)

Utilizator blechereyalBlecher Eyal blechereyal Data 14 ianuarie 2013 21:35:22
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <string.h>
#define MAXN 15001
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int noeib; //no of elem in bucket
int N,M,A[MAXN],buck[MAXN],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
{
 int j=1;
 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,j,b,sum,op;

    f>>N>>M;
    for (i=0;i<N;i++)
        f>>A[i];
    memset(buck,0,sizeof(buck));
    bksize=rad(N);
    nobk=N/bksize;
    j=1;
    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;
}