Cod sursa(job #694215)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 27 februarie 2012 19:22:04
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;

struct punct {int p,c;} zero;
punct a[100100];
int n,m;
int s[100100][65];

struct cmp
{
	inline bool operator()(const punct &a,const punct &b) const
	{
		return (a.p<b.p);
	}
};

inline int bs(int poz)
{
	int i=1,cnt=1<<20;
	for(;cnt>0;cnt>>=1)
	{
		if(i+cnt<=n)
		{
			if(a[i+cnt].p<=poz) i+=cnt;
		}
	}
	
	return i;
}

int main()
{
	ifstream in("marbles.in");
	ofstream out("marbles.out");
	
	in>>n>>m;
	for(int i=1;i<=n;++i)
	{
		in>>a[i].p>>a[i].c;
	}
	
	sort(a+1,a+n+1,cmp());
	for(int i=1;i<=n;++i)
	{
		memcpy(s[i],s[i-1],sizeof(s[i-1]));
		++s[i][a[i].c];
	}
	
	//for(int i=1;i<=n;++i)
	//{
		//cout<<a[i].p<<' '<<a[i].c<<'\n';
	//}
	
	//cout<<'\n';
	
	for(int i=1;i<=m;++i)
	{
		int q,x,y;
		in>>q>>x>>y;
		if(q==0)
		{
			//memcpy(s[x+y],s[x],sizeof(s[x]));
			//memset(s[x],0,sizeof(s[x]));
			int pz=bs(x);
			a[pz].p=x+y;
			//cout<<"\n\n";
			//cout<<pz<<' '<<x<<' '<<y<<"\n\n\n";
		}
		else
		{
			int l1=bs(x-1),l2=bs(y);
			//cout<<l1<<' '<<l2<<'\n';
			//cout<<x<<' '<<y<<'\n';
			int sol=0;
			for(int j=0;j<=64;++j)
			{
				if(sol<s[l2][j]-s[l1][j])
				{
					sol=s[l2][j]-s[l1][j];
				}
			}
			
			out<<sol<<'\n';
		}
	}
	
	out.close();
	return 0;
}