Pagini recente » Cod sursa (job #84970) | Cod sursa (job #57892) | Cod sursa (job #2721332) | Cod sursa (job #1360824) | Cod sursa (job #1059125)
#include <stdio.h>
using namespace std;
const int N=3501;
int t[N],r[N][N],n,T,v1[N],v2[N];
int max(int a, int b)
{
if(a>b) return a;
return b;
}
int query(int i, int j)
{
int dmax=-1,p=i,q;
while(p>0)
{
q=j;
while(q>0)
{
if(r[p][q]>dmax) {dmax=r[p][q];}
q-=q&-q;
}
p-=p&-p;
}
return dmax;
}
void update(int i, int j)
{
int p=i,q;
r[i][j]=query(i-1,j-1)+1;
while(p<=n)
{
q=j;
while(q<=n)
{
r[p][q]=max(r[p][q],r[i][j]);
q+=q&-q;
}
p+=p&-p;
}
}
int main()
{
FILE *in,*out;
in=fopen("cutii.in","r");
out=fopen("cutii.out","w");
int k,i,j,x,y,z,max;
fscanf(in,"%d%d",&n,&T);
for(k=1;k<=T;k++)
{
for(i=1;i<=n;i++)
{
fscanf(in,"%d%d%d",&x,&y,&z);
v1[x]=y;
v2[x]=z;
}
max=-1;
for(i=1;i<=n;i++)
{
r[i][i]=query(v1[i]-1,v2[i]-1)+1;
if(r[i][i]>max) max=r[i][i];
update(v1[i],v2[i]);
}
fprintf(out,"%d\n",max+1);
}
return 0;
}