Cod sursa(job #1724830)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 4 iulie 2016 13:02:40
Problema NextSeq Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <algorithm>
#define MAX 6000000
#define MaxL 10000
using namespace std;
char f[MAX];
int pos=0,v[MaxL]={},first[MaxL]={},last[MaxL]={},final[MaxL]={},N,M,P,X,ANSWER[40005]={},aux[40005]={};
void r(int &nr)
{
	nr=0;
	while(f[pos]<'0'||f[pos]>'9')
		pos++;
	while(f[pos]>='0'&&f[pos]<='9')
		nr=nr*10+f[pos++]-'0';
}
int binsearch(int value)
{
	int lw=1,mid,hi=N;
	while(lw<=hi)
	{
		mid=(lw+hi)>>1;
		if(v[mid]<value)
			lw=mid+1;
		else if(v[mid]>value)
			hi=mid-1;
		else return mid;
	}
	return lw;
}
void Multiply(int A[],int B[],int nr)
{
    int i=1,t=0;
    while(i<=B[0]||t>0)
    {
        A[i]=B[i]*nr+t;
        t=A[i]/10;
        A[i]%=10;
        i++;
    }
    A[0]=i-1;
}
void Sum(int A[],int B[])
{
    int i=1,t=0;
    while(i<=A[0]||i<=B[0]||t>0)
    {
        A[i]+=t+B[i];
        t=A[i]/10;
        A[i]%=10;
        i++;
    }
    A[0]=i-1;
}
void Substract(int S[],int B[],int C[],int Base)
{
	int j,size=1;
	for(int i=1;i<=P;i++)
	{
		C[i]-=B[i];
		j=i;
		if(C[j]<0)
		{
			C[j]=Base+C[j];
			C[j+1]--;
			j++;
		}
		S[size++]=C[i];
	}
	while(S[size]==0)
		size--;
	S[1]--;
	j=1;
	while(S[j]<0)
	{
		S[j]=Base+S[j];
		S[j+1]--;
		j++;
	}
	int pow[40005]={1,1};
	for(int i=1;i<=size;i++)
	{
		int aux[40005]={};
		Multiply(aux,pow,S[i]);
		Multiply(pow,pow,Base);
		Sum(ANSWER,aux);
	}
}
int main()
{
    freopen("nextseq.in","r",stdin);
    freopen("nextseq.out","w",stdout);
	fread(f,1,MAX,stdin);
	r(N);r(M);r(P);
	for(int i=1;i<=N;i++)
		r(v[i]);
	sort(v+1,v+1+N);
	for(int i=0;i<M;i++)
	{
		r(X);
		first[M-i]=binsearch(X);
	}
	for(int i=0;i<P;i++)
	{
		r(X);
		last[P-i]=binsearch(X);
	}
	Substract(final,first,last,N);
	for(int i=ANSWER[0];i>0;i--)
		printf("%d",ANSWER[i]);
    return 0;
}