Pagini recente » Cod sursa (job #142906) | Cod sursa (job #618941) | Cod sursa (job #1601899) | Cod sursa (job #2699482) | Cod sursa (job #1412975)
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
#define f first
#define s second
using namespace std;
long long n,m,i,instr,ii,j,Max,maxy,x1,x2,dif,I;
unsigned int nr[100005][66],V[66],V2[66],v[100005];
pair <long long,int>a[100005];
inline int cautare(long long poz)
{
int st,dr,mij,i;
bool ok=false;
st=1;
dr=n;
while (st<=dr)
{
mij=(st+dr)/2;
if (a[mij].f>poz)dr=mij-1;
else if (a[mij].f<poz)st=mij+1;
else
{
ok=true;
break;
}
}
if (ok==true)return mij;
else
{
for (i=1; i<=n; i++)
if (a[i].f>poz)return i;
}
}
int main()
{
freopen("marbles.in","r",stdin);
freopen("marbles.out","w",stdout);
scanf("%lld %lld",&n,&m);
for (i=1; i<=n; i++)
{
scanf("%lld %d\n",&a[i].f,&a[i].s);
if (a[i].s>maxy)maxy=a[i].s;
v[i]=maxy;
}
sort(a+1,a+n+1);
for (i=1; i<=n; i++)
{
memcpy(nr[i],nr[i-1],sizeof(nr[i-1]));
nr[i][a[i].s]++;
}
for (i=1; i<=m; i++)
{
scanf("%lld %lld %lld\n",&instr,&ii,&j);
if (instr==1)
{
x1=cautare(ii);
x2=cautare(j);
Max=0;
memcpy(V,nr[x1],sizeof(nr[x1]));
memcpy(V2,nr[x2],sizeof(nr[x2]));
if (a[x2].f!=j)V2[a[x2].s]--;
// if (a[x2].f!=j)V2[a[x2].s]--;
for (I=1; I<=max(v[x1],v[x2]); I++)
{
dif=V2[I]-V[I];
if (a[x1].s==I)dif++;
Max=max(dif,Max);
}
if (Max>0) printf("%lld\n",Max);
else printf("0\n");
}
else
{
x1=cautare(ii);
a[x1].f=ii+j;
}
}
return 0;
}