Advertisement
a53

easyxy

a53
Feb 12th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. /// Popa Bogdan Ioan clasa a 10-a, Colegiul National Aurel Vlaicu
  2.  
  3. /// Se da un vector v cu N elemente numere naturale numerotate de la 1 la N si M întrebari de forma:
  4. /// x y p: se afiseaza valoarea ce s-ar afla pe pozitia p daca v[x...y] ar fi ordonat crescator.
  5. /// Sa se raspunda la cele M întrebari.
  6.  
  7. #include <bits/stdc++.h>
  8. #define nmax 100002
  9. #define vmax 1000000000
  10. #define pb push_back
  11. using namespace std;
  12. ifstream fin("easyxy.in");
  13. ofstream fout("easyxy.out");
  14. vector <int> arb[4*nmax+55]; /// Arborele de intervale
  15. int a[nmax]; /// Vectorul care memoreaza cele n numere
  16. int n,m; /// n-numarul de element; m-numarul de intrebari
  17.  
  18. void build(int nod,int st,int dr) /// Construieste arborele de intervale
  19. {
  20. if(st==dr)
  21. {
  22. arb[nod].pb(a[st]);
  23. return;
  24. }
  25. int mij=(st+dr)/2;
  26. build(2*nod,st,mij);
  27. build(2*nod+1,mij+1,dr);
  28. int i,j;
  29. for(i=0,j=0;i<(int)arb[2*nod].size()&&j<(int)arb[2*nod+1].size();)
  30. {
  31. if(arb[2*nod][i]<=arb[2*nod+1][j])
  32. arb[nod].pb(arb[2*nod][i++]);
  33. else
  34. arb[nod].pb(arb[2*nod+1][j++]);
  35. }
  36. while(i<(int)arb[2*nod].size())
  37. arb[nod].pb(arb[2*nod][i++]);
  38. while(j<(int)arb[2*nod+1].size())
  39. arb[nod].pb(arb[2*nod+1][j++]);
  40. }
  41.  
  42. int lwr;
  43. bool ok;
  44. void query(int nod,int st,int dr,int a,int b,int val) /// Interogare arbore de intervale
  45. {
  46. if(a<=st&&dr<=b)
  47. {
  48. int pozitia=upper_bound(arb[nod].begin(),arb[nod].end(),val)-arb[nod].begin();
  49. lwr+=pozitia;
  50. if(pozitia!=0)
  51. if(arb[nod][pozitia-1]==val)
  52. ok=true;
  53. return;
  54. }
  55. int mij=(st+dr)/2;
  56. if(a<=mij)
  57. query(2*nod,st,mij,a,b,val);
  58. if(b>mij)
  59. query(2*nod+1,mij+1,dr,a,b,val);
  60. }
  61.  
  62. int sol(int st,int dr,int poz) /// Cautare binara pentru gasirea unei solutii (st-limita din stanga (x); dr-limita din drapta (y))
  63. {
  64. int s=1,d=n,mijloc,best=-1; /// s-stanga; d-dreapta; best-valoarea care s-ar afla pe pozitia poz
  65. while(s<=d)
  66. {
  67. mijloc=s+(d-s)/2; /// mijloc-mijlocul intervalului
  68. lwr=0;
  69. ok=false;
  70. query(1,1,n,st,dr,a[mijloc]);
  71. if(st+lwr-1>=poz)
  72. {
  73. if(ok)
  74. {
  75. best=a[mijloc];
  76. if(st+lwr-1==poz)
  77. return a[mijloc];
  78. }
  79. d=mijloc-1;
  80. }
  81. else
  82. s=mijloc+1;
  83. }
  84. return best;
  85. }
  86.  
  87. int main()
  88. {
  89. fin>>n>>m;
  90. for(int i=1;i<=n;i++)
  91. fin>>a[i];
  92. build(1,1,n);
  93. for(int i=1;i<=n;++i)
  94. a[i]=arb[1][i-1];
  95. int x,y,p;
  96. while(m--) /// Cele m interogari
  97. {
  98. fin>>x>>y>>p; /// Citesc intervalul [x,y] si poozitia p
  99. fout<<sol(x,y,p)<<'\n'; /// Afisez solutia pentru un interval
  100. }
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement