Cod sursa(job #197708)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 5 iulie 2008 15:53:18
Problema Reconst Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<fstream>
using namespace std;
fstream in,out;
int aux;
int i,j,j2,k;
int sm;
int m,n;
int s[3][2001];
int x[2001];

void interclasare(int p, int m, int q)
  {
  int i=p,j=m+1,k=0;
  int v[3][2001];
  while(i<=m && j<=q)
    if((s[1][i]<s[1][j]) || (s[1][i]==s[1][j] && s[2][i]<=s[2][j])) { k++; v[0][k]=s[0][i]; v[1][k]=s[1][i]; v[2][k]=s[2][i]; i++; }
    else { k++; v[0][k]=s[0][j]; v[1][k]=s[1][j]; v[2][k]=s[2][j]; j++; }
  while(i<=m) { k++; v[0][k]=s[0][i]; v[1][k]=s[1][i]; v[2][k]=s[2][i]; i++; }
  while(j<=q) { k++; v[0][k]=s[0][j]; v[1][k]=s[1][j]; v[2][k]=s[2][j]; j++; }
  for(i=p;i<=q;i++) { s[0][i]=v[0][i-p+1]; s[1][i]=v[1][i-p+1]; s[2][i]=v[2][i-p+1]; }
  }
void msort(int p, int q)
  {
  if(q>p)
    {
    int m=(p+q)/2;
    msort(p,m);
    msort(m+1,q);
    interclasare(p,m,q);
    }
  }
int main()
{
in.open("reconst.in",ios::in);
out.open("reconst.out",ios::out);
in>>n>>m;
for(i=1;i<=m;i++)
  in>>s[1][i]>>s[2][i]>>s[0][i];

msort(1,m);
for(i=1;i<=m-1;i++)
  if(s[1][i]==s[1][i+1] && s[2][i]+1==s[2][i+1]) x[s[2][i+1]]=s[0][i+1]-s[0][i];
  else if(s[2][i]==s[2][i+1] && s[1][i]+1==s[1][i+1]) x[s[1][i]]=s[0][i]-s[0][i+1];
j=j2=m;
for(i=n;i>=1;i--)
  if(x[i]==0)
    {
    j=j2;
    while(s[1][j]>i) j--;
    j2=j;
    while(s[1][j]>i || s[2][j]<i) j--;
    sm=0;
    for(k=s[1][j];k<=s[2][j];k++)
      if(k!=i && x[k]!=0)
	sm=sm+x[k];
      else if(x[k]==0 && k!=i) break;
    if(k>s[2][j])  x[i]=s[0][j]-sm;
    }
for(i=1;i<=m;i++) { aux=s[1][i]; s[1][i]=s[2][i]; s[2][i]=aux; }
msort(1,m);
j=j2=1;
for(i=1;i<=n;i++)
  if(x[i]==0)
    {
    j=j2;
    while(s[1][j]<i) j--;
    j2=j;
    while(s[1][j]<i || s[2][j]>i) j--;
    sm=0;
    for(k=s[1][j];k>=s[2][j];k--)
      if(k!=i)
	sm=sm+x[k];
    x[i]=s[0][j]-sm;
    }
for(i=1;i<=n;i++)
  out<<x[i]<<" ";
in.close();
out.close();
return 0;
}