Cod sursa(job #541790)

Utilizator t2011tVasilescu Popescu t2011t Data 25 februarie 2011 14:24:50
Problema Walls Scor 0
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 2.28 kb
#include <stdio.h>
int lovitn,hmax,x,y,h,w,k=1,wall[100000][3],lovit[100000][3],i1,i2,i3,n,M;
bool binlovit;
int main()
{
FILE *in,*out;
in=fopen("walls.in","rt");
out=fopen("walls.out","wt");

fscanf(in,"%d",&n); //citim nr ziduri

for(i1=0;i1<n;i1++) //citire
    {
    fscanf(in,"%d%d",&w,&wall[i1][2]); //zid-width,inaltime-zid
    if(wall[i1][2]>hmax)
        hmax=wall[i1][2]; //gasim h max
    wall[i1][0]=k;
    wall[i1][1]=k+w-1;
    k+=3;
    //printf("%d %d %d\n",wall[i1][0],wall[i1][1],wall[i1][2]); //x1,x2,h
    }

fscanf(in,"%d",&M); //numarul de trageri

for(i1=0;i1<M;i1++)
    {
    fscanf(in,"%d%d",&x,&y);
    if(y<=hmax)
        {
        //printf("%d %d ",x,y);
        //cautam de unde incep zidurile mai in stanga decat tunul; x2
        i2=n-1;
        while(wall[i2][1]>x)
            i2--;
        //incepand de la zidul gasit pe i2, cautam pe cele cu h mai mare sau egal decat y turn
        while(wall[i2][2]<y)
            i2--;
        //gasit - turnul nimerit - i2;
        //printf("%d\n",i2);

        //nivelul la care a fost lovit zidul este y, verificam daca a mai fost lovit nivelul respectiv
        //din turnul respectiv
        binlovit=false;
        for(i3=0;i3<lovitn;i3++)
            {
            if(lovit[i3][0]==i2&&lovit[i3][1]==y) //lovit la acelasi zid + acelasi nivel
                {
                binlovit=true;
                lovit[i3][3]++;
                //daca a fost lovit nivelul respectiv verificam daca ajunge sa-l doboare
                if(lovit[i3][3]==wall[i2][1]-wall[i2][0])
                    {
                     fprintf(out,"HIT %d %d YES\n",wall[i2][1]-lovit[i3][3],i2+1);
                     wall[i2][2]=y-1;
                    }
                else
                    fprintf(out,"HIT %d %d NO\n",wall[i2][1]-lovit[i3][3],i2+1); //daca nu l-a doborat
                }
            }
        if(!binlovit) // daca n-a mai fost lovit pana acum {zid,nivel}
            {
            lovit[lovitn][0]=i2;
            lovit[lovitn][1]=y;
            lovit[lovitn][2]=1;
            lovitn++;
            fprintf(out,"HIT %d %d NO\n",wall[i2][1]-lovit[i3][3],i2+1);
            }

        }
    else
        fprintf(out,"MISS\n");
    }


fclose(in);
fclose(out);
return 0;
}