Splay模板

  1 //poj3580

  2 //#pragma comment(linker,"/STACK:102400000,102400000")

  3 #include <cstdio>

  4 #include <set>

  5 #include <map>

  6 #include <ctime>

  7 #include <cctype>

  8 #include <string>

  9 #include <cstring>

 10 #include <cstdlib>

 11 #include <cmath>

 12 #include <assert.h>

 13 #include <algorithm>

 14 #include <iostream>

 15 #include <climits>

 16 #include <queue>

 17 #include <vector>

 18 

 19 #define dte(x) cout << #x << " = " << x << endl;

 20 #define scaf2(x,y) scaf(x);scaf(y);

 21 #define mkp make_pair

 22   

 23 using namespace std;

 24 template<typename T>inline void scaf(T&v)

 25 {

 26     char ch = getchar();

 27     for(; ch < '0' || ch > '9'; ch = getchar());

 28     for(v = 0; ch >= '0' && ch <= '9'; ch = getchar()) v = (v << 1) +(v << 3) + ch - '0';

 29 }

 30 typedef long long LL;

 31 typedef unsigned long long ULL;

 32 typedef pair <int, int> PII;

 33 const int maxN = 2e5 + 10;

 34 const LL mod = 1e9 + 7;

 35 const double eps = 1e-9;

 36 const LL oo = ~ 0U >> 2;

 37 

 38 int inn[maxN];

 39 

 40 struct SplayTree

 41 {

 42     static const int smaxN = 4e5 + 10;

 43     #define keyNode chird[chird[root][1]][0]

 44     int item[smaxN];

 45     int parent[smaxN];

 46     int sz[smaxN];

 47     int chird[smaxN][2];

 48     

 49     int root, vtot;

 50     

 51     SplayTree()

 52     {

 53         root = vtot = 0;

 54         item[0] = -1;

 55         parent[0] = sz[0] = chird[0][0] = chird[0][1] = 0;

 56     }

 57     

 58     void Rotate(const int& x, const int& lr)

 59     {//lr - > 0: leftRotate 1: rightRotate

 60         int y = parent[x];

 61         pushDown(y); pushDown(x);

 62         chird[y][! lr] = chird[x][lr];

 63         if (chird[x][lr]) parent[chird[x][lr]] = y;

 64         parent[x] = parent[y];

 65         if (parent[y])

 66         {

 67             if (chird[parent[y]][0] == y) chird[parent[y]][0] = x;

 68             else chird[parent[y]][1] = x;

 69         }

 70         chird[x][lr] = y; parent[y] = x;

 71         pushUp(y);

 72     }

 73     

 74     void Splay(int x, const int& target)

 75     {//Splay x to target't chird -- target must be x's ancestor

 76         for (pushDown(x); parent[x] != target;)

 77         {

 78             if (parent[parent[x]] == target)/*x's father's father is target -> rotate x to x's father*/

 79             {

 80                 if (chird[parent[x]][0] == x) Rotate(x, 1);

 81                 else Rotate(x, 0);

 82             }else

 83             {

 84                 int y = parent[x], z = parent[parent[x]];

 85                 if (chird[z][0] == y)/*y is z's lson*/

 86                 {

 87                     if (chird[y][0] == x) Rotate(y, 1), Rotate(x, 1);//yi zi xing

 88                     else Rotate(x, 0), Rotate(x, 1);//zhi zi xing

 89                 }else

 90                 {

 91                     if (chird[y][0] == x) Rotate(x, 1), Rotate(x, 0);//zhi

 92                     else Rotate(y, 0), Rotate(x, 0);//yi

 93                 }

 94             }

 95         }

 96         pushUp(x);

 97         if (!target) root = x;

 98     }

 99     

100     int Search(const int& target)

101     {

102         int x = root;

103         while (x)

104         {

105             if (item[x] == target) break;

106             if (item[x] > target) x = chird[x][0];

107             else x = chird[x][1];

108         }

109         if (x) Splay(x, 0);

110         return x;

111     }

112     

113     void Insert(const int& target, const int& _id)

114     {

115 //        if (Search(target)) return;//exist?

116         int x = root, y = 0, lr;

117         while (x)

118         {

119             y = x; ++ sz[y];

120             if (item[x] > target) x = chird[x][0];

121             else x = chird[x][1];

122         }

123         if (item[y] > target) lr = 0;

124         else lr = 1;

125         sz[x = ++ vtot] = 1;

126         parent[x] = y; chird[y][lr] = x;

127         item[x] = target;

128         chird[x][0] = chird[x][1] = 0;

129         Splay(x, 0);

130     }

131     

132     void Delete(const int& target)

133     {

134         int x = Search(target);

135         if (!x) return;//no exist

136         int lc = chird[x][0], rc = chird[x][1];

137         sz[x] = parent[lc] = parent[rc] = chird[x][0] = chird[x][1] = 0;

138         if (!lc) root = rc;

139         else

140         {

141             for (pushDown(lc); chird[lc][1]; pushDown(lc)) lc = chird[lc][1];

142             Splay(lc, 0);

143             parent[rc] = lc;

144             chird[lc][1] = rc;

145             pushUp(root);

146         }

147     }

148     

149     int findParent(const int& target)

150     {

151         int x = root, ret = 0;

152         while (x)

153         {

154             if (target <= item[x]) x = chird[x][0];

155             else ret = x, x = chird[x][1];

156         }

157         if (ret) Splay(ret, 0);

158         return ret;

159     }

160     

161     int findSuccessor(const int& target)

162     {

163         int x = root, ret = 0;

164         while (x)

165         {

166             if (target >= item[x]) x = chird[x][1];

167             else ret = x, x = chird[x][0];

168         }

169         if (ret) Splay(ret, 0);

170         return ret;

171     }

172     

173     int findKth(int k, const int& target)

174     {

175         int x = root;

176         while (x)

177         {

178             pushDown(x);

179              int y = sz[chird[x][0]];

180             if (y == k) break;

181             if (y > k) x = chird[x][0];

182             else x = chird[x][1], k -= y + 1;

183         }

184         if (x) Splay(x, target);

185         return x;//item[x]???

186     }

187     

188     void Treaval(const int& x, int& num)

189     {

190         if (x)

191         {

192             pushDown(x);

193             Treaval(chird[x][0], num);

194             printf("%d", item[x]);

195             if (-- num) putchar(32);

196             else putchar(10);

197             Treaval(chird[x][1], num);

198         }

199     }

200     

201     void outPut(int n)

202     {

203         int m = n;

204         findKth(0, 0);

205         Treaval(root, m);

206     }

207     

208     void newNode(int& x, const int& val, const int& father)

209     {

210         item[x = ++ vtot] = val; sz[x] = 1; parent[x] = father; 

211         minVal[x] = val; rev[x] = false; addLazy[x] = 0;

212         chird[x][0] = chird[x][1] = 0;

213     }

214     

215     void buildSplay(int n)

216     {

217         root = vtot = 0;

218         item[0] = 0; rev[0] = 0; addLazy[0] = 0; minVal[0] = oo;

219         parent[0] = sz[0] = chird[0][0] = chird[0][1] = 0;

220         newNode(root, oo, 0);//ex node?

221         newNode(chird[root][1], oo, root);

222         buildTree(keyNode, 1, n, chird[root][1]);

223         pushUp(chird[root][1]);

224         pushUp(root);

225     }

226     

227     void buildTree(int& x, const int& l, const int& r, const int& father)

228     {

229         if (l > r) return;

230         int mid = l + r >> 1;

231         newNode(x, inn[mid], father);

232         buildTree(chird[x][0], l, mid - 1, x);

233         buildTree(chird[x][1], mid + 1, r, x);

234         pushUp(x);

235     }

236     

237     void pushUp(const int& x)

238     {

239         sz[x] = sz[chird[x][0]] + sz[chird[x][1]] + 1;

240         minVal[x] = item[x];

241         if (chird[x][0]) minVal[x] = min(minVal[x], minVal[chird[x][0]]);

242         if (chird[x][1]) minVal[x] = min(minVal[x], minVal[chird[x][1]]);;

243     }

244     

245     void pushDown(const int& x)

246     {

247         if (rev[x])

248         {

249             int lc = chird[x][0], rc = chird[x][1];

250             swap(chird[x][0], chird[x][1]);

251             if (lc) rev[lc] ^= 1;

252             if (rc) rev[rc] ^= 1;

253             rev[x] ^= 1;

254         }

255         if (addLazy[x])

256         {

257             if (chird[x][0])

258             {

259                 item[chird[x][0]] += addLazy[x];

260                 minVal[chird[x][0]] += addLazy[x];

261                 addLazy[chird[x][0]] += addLazy[x];

262             }

263             if (chird[x][1])

264             {

265                 item[chird[x][1]] += addLazy[x];

266                 minVal[chird[x][1]] += addLazy[x];

267                 addLazy[chird[x][1]] += addLazy[x];

268             }

269             addLazy[x] = 0;

270         }

271     }

272     

273     void add(const int& l, const int& r, const int& v)

274     {

275         findKth(l - 1, 0); findKth(r + 1, root);

276         item[keyNode] += v;

277         addLazy[keyNode] += v;

278         minVal[keyNode] += v;

279         Splay(keyNode, 0);

280     }

281     

282     void insVal(const int& l, const int& v)

283     {

284         findKth(l, 0); findKth(l + 1, root);

285         if (keyNode) while (1);

286         newNode(keyNode, v, chird[root][1]);

287         Splay(keyNode, 0);

288     }

289     

290     void del(const int& target)

291     {

292         findKth(target, 0);

293         pushDown(root);

294         int x = root;

295         int lc = chird[x][0], rc = chird[x][1];

296         sz[x] = parent[lc] = parent[rc] = chird[x][0] = chird[x][1] = 0;

297         if (!lc) root = rc;

298         else

299         {

300             for (pushDown(lc); chird[lc][1]; pushDown(lc)) lc = chird[lc][1];

301             Splay(lc, 0);

302             parent[rc] = lc;

303             chird[lc][1] = rc;

304             pushUp(root);

305         }

306     }

307     

308     int getMin(const int& l, const int& r)

309     {

310         findKth(l - 1, 0); findKth(r + 1, root);

311         return minVal[keyNode];

312     }

313     

314     void Reverse(const int& l, const int& r)

315     {

316         findKth(l - 1, 0); findKth(r + 1, root);

317         rev[keyNode] ^= 1;

318         Splay(keyNode, 0);

319     }

320     

321     void Revolve(const int& l, const int& r, const int& v)

322     {

323         int rr = r - v;

324         int ll = rr + 1;

325         findKth(ll - 1, 0); findKth(r + 1, root);

326         int x = keyNode; keyNode = 0; parent[x] = 0;

327         pushUp(chird[root][1]); pushUp(root);

328         findKth(l - 1, 0); findKth(l, root);

329         keyNode = x;

330         parent[keyNode] = chird[root][1];

331         pushUp(chird[root][1]); pushUp(root);

332         Splay(keyNode, 0);

333     }

334     

335     int minVal[smaxN];

336     int addLazy[smaxN];

337     bool rev[smaxN];

338 }spt;

339 

340 int main()

341 {

342 //    freopen("ok.out", "w", stdout);

343     int n, i, m;

344     int l, r, v;

345     char opt[10];

346 //    scaf(n);

347     scanf("%d", &n);

348     for (i = 1; i <= n; ++ i)

349 //        scaf(inn[i]);

350         scanf("%d", &inn[i]);

351     spt.buildSplay(n);

352 //    scaf(m);

353     scanf("%d", &m);

354     while (m --)

355     {

356         scanf("%s", opt);

357 //        printf("%s\n", opt);

358         if ('A' == opt[0])

359         {

360 //            scaf2(l, r); scaf(v);

361             scanf("%d%d%d", &l, &r, &v);

362             spt.add(l, r, v);

363         }else if ('I' == opt[0])

364         {

365 //            scaf2(l, v);

366             scanf("%d%d", &l, &v);

367             spt.insVal(l, v);

368         }else if ('D' == opt[0])

369         {

370 //            scaf(v);

371             scanf("%d", &v);

372              spt.del(v);

373 //             spt.outPut(spt.sz[spt.root]);

374         }else if ('M' == opt[0])

375         {

376 //            scaf2(l, r);

377             scanf("%d%d", &l, &r);

378             printf("%d\n", spt.getMin(l, r));

379         }else if ('E' == opt[3])

380         {

381 //            scaf2(l, r);

382             scanf("%d%d", &l, &r);

383             spt.Reverse(l, r);

384 //            spt.outPut(spt.sz[spt.root]);

385         }else

386         {

387 //            scaf2(l, r); scaf(v);

388             scanf("%d%d%d", &l, &r, &v);

389             int len = r - l + 1;

390             v = (v % len + len) % len;

391             if (v) spt.Revolve(l, r, v);

392         }

393         spt.findKth(0, 0);

394 //        spt.outPut(spt.sz[spt.root]);

395 //        printf("%d\n", spt.sz[spt.root]);

396     }

397     return 0;

398 }

 

你可能感兴趣的:(play)