Cod sursa(job #1412996)
Utilizator | Data | 1 aprilie 2015 18:00:36 | |
---|---|---|---|
Problema | Marbles | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.64 kb |
#include <cstdio>
using namespace std;
int n,m,st,dr,Max,Max1,a[100004],b[70][100004],c[70],mi,i,j,p,y,z,q,aux;
bool ok;
char x;
int main()
{
freopen ("marbles.in","r",stdin);
freopen ("marbles.out","w",stdout);
scanf ("%d %d", &n, &m);
Max=0;
for (i=1;i<=n;i++)
{
scanf ("%d %d", &a[i], &x);
if (x>Max)
Max=x;
b[x][++c[x]]=a[i];
}
for (i=1;i<=m;i++)
{
scanf ("%d ", &p);
scanf ("%c", &x);
y=0;
z=0;
if (x=='-')
{
scanf ("%d ", &y);
y*=-1;
}
else
{
while (x!=' ')
{
y*=10;
y+=(x-'0');
scanf ("%c", &x);
}
}
scanf ("%c", &x);
if (x=='-')
{
scanf ("%d ", &z);
z*=-1;
}
else
{
while (x!='\n')
{
z*=10;
z+=(x-'0');
scanf ("%c", &x);
}
}
if (p==1)
{
if (y>z)
printf ("%d\n", 0);
else
{
Max1=0;
for (j=1;j<=Max;j++)
{
st=1;
dr=c[j];
while (st<=dr)
{
mi=(st+dr)/2;
if (b[j][mi]>=y)
dr=mi-1;
else
st=mi+1;
}
q=st;
st=1;
dr=c[j];
while (st<=dr)
{
mi=(st+dr)/2;
if (b[j][mi]>z)
dr=mi-1;
else
st=mi+1;
}
st-=q;
if (st>Max1)
Max1=st;
}
printf ("%d\n", Max1);
}
}
else
{
z=y+z;
ok=false;
for (j=1;j<=Max;j++)
{
st=1;
dr=c[j];
while (st<=dr)
{
mi=(st+dr)/2;
if (b[j][mi]>y)
dr=mi-1;
else if (b[j][mi]<y)
st=mi+1;
else
{
ok=true;
break;
}
}
if (ok==true)
break;
}
b[j][mi]=z;
}
}
return 0;
}