Pagini recente » Cod sursa (job #2913080) | Cod sursa (job #1683073) | Atasamentele paginii Clasament aaaaaaaaaaaaaaaaaaaaaaa | Monitorul de evaluare | Cod sursa (job #239618)
Cod sursa(job #239618)
#include <stdio.h>
#include <ctype.h>
#include <vector>
using namespace std;
int n,m,ind;
char buf[30];
vector < vector <int> > a;
vector <int> sol;
int readn()
{
int ans=0;
while (isdigit(buf[ind]))
{
ans=ans*10+buf[ind]-'0';
++ind;
}
++ind;
return ans;
}
void GaussJordan()
{
vector <bool> was(m+1);
for (int w=1;w<=n;++w)
for (int q=1;q<=m;++q)
if (!was[q] && a[q][w]==1)
{
was[q]=true;
for (int i=1;i<=m;++i)
{
if (q==i || a[i][w]==0) continue;
int szorzo=a[i][w]/a[q][w];
for (int j=1;j<=n+1;++j) a[i][j]-=a[q][j]*szorzo;
}
}
}
void solve()
{
bool found=true;
while (found)
{
found=false;
for (int q=1;q<=m;++q)
{
int n1=0, col;
for (int w=1;w<=n;++w)
if (a[q][w]==1)
{
++n1;
col=w;
}
if (n1==1)
{
found=true;
sol[col]=a[q][n+1];
for (int i=1;i<=m;++i)
if (a[i][col])
{
a[i][n+1]-=a[i][col]*sol[col];
a[i][col]=0;
}
}
}
}
}
int main()
{
FILE* fin=fopen("reconst.in","r");
fscanf(fin,"%d%d\n",&n,&m);
a.resize(m+1,vector <int> (n+2));
for (int q=1;q<=m;++q)
{
fgets(buf,30,fin);
ind=0;
int x=readn(),y=readn(),z=readn();
for (int w=x;w<=y;++w) a[q][w]=1;
a[q][n+1]=z;
}
fclose(fin);
GaussJordan();
sol.resize(n+1);
solve();
FILE* fout=fopen("reconst.out","w");
for (int q=1;q<=n;++q) fprintf(fout,"%d ",sol[q]);
fclose(fout);
return 0;
}