Advertisement
iletavcioski

Zamrce 2D

Mar 29th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<cstring>
  4. using namespace std;
  5. int n,m,a,b,c,d;
  6. static int dp[1001][1001];
  7. static pair<int,pair<int,int> > segtree[2003][2003];
  8. bool cc;
  9. int r1,r2,k1,k2,x,y,vrednost;
  10. pair<int,pair<int,int> >vre;
  11. void updateredici(int p1,int l,int r,int p)
  12. {
  13.     if(r<k1||k2<l)
  14.         return;
  15.     if(k1<=l&&r<=k2)
  16.     {
  17.         if(cc){
  18.             segtree[p1][p]=vre;
  19.         }
  20.         else
  21.         {
  22.             segtree[p1][p]=min(segtree[2*p1][p],segtree[2*p1+1][p]);
  23.         }
  24.         return;
  25.     }
  26.     updateredici(p1,l,(l+r)/2,2*p);
  27.     updateredici(p1,(l+r)/2+1,r,2*p+1);
  28.     segtree[p1][p]=min(segtree[p1][2*p],segtree[p1][2*p+1]);
  29. }
  30. void updatekoloni(int l,int r,int p)
  31. {
  32.     if(r<r1||r2<l)
  33.         return;
  34.     if(r1<=l&&r<=r2)
  35.     {
  36.         cc=true;
  37.         updateredici(p,1,m,1);
  38.         return;
  39.     }
  40.     updatekoloni(l,(l+r)/2,2*p);
  41.     updatekoloni((l+r)/2+1,r,2*p+1);
  42.     cc=0;
  43.     updateredici(p,1,m,1);
  44. }
  45. pair<int,pair<int,int> > queryredici(int p1,int l,int r,int p)
  46. {
  47.     if(r<k1||k2<l)
  48.     {
  49.         return make_pair(1000000001,make_pair(0,0));
  50.     }
  51.     if(k1<=l&&r<=k2)
  52.     {
  53.         return segtree[p1][p];
  54.     }
  55.     return min(queryredici(p1,l,(l+r)/2,2*p),queryredici(p1,(l+r)/2+1,r,2*p+1));
  56. }
  57. pair<int,pair<int,int> > querykoloni(int l,int r,int p)
  58. {
  59.     if(r<r1||r2<l)
  60.     {
  61.         return make_pair(1000000001,make_pair(0,0));
  62.     }
  63.     if(r1<=l&&r<=r2)
  64.     {
  65.         return queryredici(p,1,m,1);
  66.     }
  67.     return min(querykoloni(l,(l+r)/2,2*p),querykoloni((l+r)/2+1,r,2*p+1));
  68. }
  69.  
  70. int main()
  71. {
  72.     cin>>m>>n>>b>>a>>d>>c; 
  73.     for(int i=1;i<=n;i++)
  74.     {
  75.         for(int j=1;j<=m;j++)
  76.         {
  77.             cin>>dp[i][j];
  78.         }
  79.     }
  80.     for(int i=1;i<=n;i++)
  81.     {
  82.         for(int j=1;j<=m;j++)
  83.         {
  84.                 dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
  85.         }
  86.     }
  87.     int krajx1,krajx2,krajy1,krajy2;
  88.     for(int i=1;i<=n;i++)
  89.     {
  90.         for(int j=1;j<=m;j++)
  91.         {
  92.             if(i-c>=0&&j-d>=0)
  93.             {
  94.                 r1=i-c;
  95.                 r2=i;
  96.                 k1=j-d;
  97.                 k2=j;
  98.                 vrednost=dp[r2][k2]-dp[r2][k1]-dp[r1][k2]+dp[r1][k1];
  99.                  r1=i-c+1;
  100.                  r2=i-c+1;
  101.                  k1=j-d+1;
  102.                  k2=j-d+1;
  103.                  x=i-c+1;
  104.                  y=j-d+1;
  105.                  vre=make_pair(vrednost,make_pair(x,y));
  106.                 updatekoloni(1,n,1);
  107.             }
  108.         }
  109.     }
  110.     int maxi=0;
  111.     for(int i=1;i<=n;i++)
  112.     {
  113.         for(int j=1;j<=m;j++)
  114.         {
  115.             if(i-a>=0&&j-b>=0)
  116.             {
  117.                  r1=i-a;
  118.                  r2=i;
  119.                  k1=j-b;
  120.                  k2=j;
  121.                  x=i-a+1;
  122.                  y=j-b+1;
  123.                  vrednost=dp[r2][k2]-dp[r2][k1]-dp[r1][k2]+dp[r1][k1];
  124.                  r1=i-a+2;
  125.                  r2=i-c;
  126.                  k1=j-b+2;
  127.                  k2=j-d;
  128.                  pair<int,pair<int,int> > res=querykoloni(1,n,1);
  129.                  int brojac=res.first;
  130.                  if((vrednost-brojac)>maxi)
  131.                  {
  132.                     maxi=(vrednost-brojac);
  133.                     krajx1=x;
  134.                     krajy1=y;
  135.                     krajx2=res.second.first;
  136.                     krajy2=res.second.second;
  137.                  }
  138.             }
  139.         }
  140.     }
  141.     cout<<krajy1<<" "<<krajx1<<endl;
  142.     cout<<krajy2<<" "<<krajx2<<endl;
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement