Cod sursa(job #333536)

Utilizator bugyBogdan Vlad bugy Data 23 iulie 2009 10:01:56
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include<stdio.h>
using namespace std;
#define dim 100001

long long q[65],a[dim],v[dim],x,y,mij,max,n,m,w[dim],b[dim],aa,bb;

int caut_bin(int in, int sf)
{
	mij=(in+sf)/2;
	if(v[mij]==x) return mij;
	else if(v[mij]>x) caut_bin(in,mij);
	else caut_bin(v[mij],sf);
}
int caut_bin2 (int z)   
{   
int inceput=1,sfarsit=n,mij,nr=n+1;   
    while (inceput<=sfarsit)   
    {mij=inceput+(sfarsit-inceput)/2;   
        if(v[mij]>=x)   
        { 
            nr=mij;   
            sfarsit=mij-1;   
        }   
        else    
            inceput=mij+1;   
    }   
    return nr;   
}
int caut_bin3 (int z)   
{   
int inceput=1,sfarsit=n,mij,nr=n+1;   
    while (inceput<=sfarsit)   
    {mij=inceput+(sfarsit-inceput)/2;   
        if(v[mij]<=y)   
        { 
            nr=mij;   
            inceput=mij+1;   
        }   
        else    
            sfarsit=mij-1;   
    }   
    return nr;   
}

void merge_sort(int li, int ls)      
{      
	

    int j,i,k,jum,m=0;      
    if(li==ls) return;      
    jum=(li+ls)/2;      
    merge_sort(li,jum);      
    merge_sort(jum+1,ls);      
    i=li;j=jum+1;k=li;      
          
    while((i<=jum)||(j<=ls))      
    {      
        if(j>ls || ( (i<=jum) && (v[i] < v[j])) )      
        {      
            w[k] = v[i];  m++; b[k]=a[i];    
            k++;      
            i++;      
        }      
        else     
        {      
            w[k] = v[j]; m++; b[k]=a[j];     
            k++;      
            j++;      
        }      
    }      
          
    for(i = ls; i >= li; i--)      
	{
		v[i] = w[i]; a[i]=b[i];
	}
}   



int main()
{int i,ok,j;
	FILE *f=fopen("marbles.in","r"), *g=fopen("marbles.out","w");
fscanf(f,"%lld%lld",&n,&m);
for(i=1;i<=n;i++)
{
	fscanf(f,"%lld%lld",&x,&y);
	v[i]=x;
	a[i]=y;
}
merge_sort(1,n);


for(i=1;i<=m;i++)
{
	fscanf(f,"%d%lld%lld",&ok,&x,&y);
	if(ok==0)
	{
			caut_bin(1,n);
			v[mij]=mij+y;
			merge_sort(1,n);
	}
	else 
	{
		max=0;
		aa=caut_bin2(x);
		bb=caut_bin3(y);
		for(j=aa;j<=bb;j++)
			if((v[j]>=x)&&(v[j]<=y))
			{
			q[ a[j] ]++;
			if(q[ a[j] ]>max)
				max=q[ a[j] ];
				
			if(v[j]>y) break;
				
			}
		fprintf(g,"%lld\n",max);
		for(j=1;j<=y;j++)
			q[ a[j] ]=0;
	}
}



fclose(f);
fclose(g);


return 0;}