E. A Simple Task

time limit per test5 seconds

memory limit per test512 megabytes

inputstandard input

outputstandard output

This task is very simple. Given a string S of length n and q queries each query is on the format i j k which means sort the substring consisting of the characters from i to j in non-decreasing order if k = 1 or in non-increasing order if k = 0.

Output the final string after applying the queries.

Input

The first line will contain two integers n, q (1 ≤ n ≤ 105, 0 ≤ q ≤ 50 000), the length of the string and the number of queries respectively.

Next line contains a string S itself. It contains only lowercase English letters.

Next q lines will contain three integers each i, j, k (1 ≤ i ≤ j ≤ n, ).

Output

Output one line, the string S after applying the queries.

Sample test(s)

input

10 5

abacdabcda

7 10 0

5 8 1

1 4 0

3 6 0

7 10 1

output

cbcaaaabdd

input

10 1

agjucbvdfk

1 10 1

output

abcdfgjkuv

Note

First sample test explanation:

题意,给一段字符串。然后一系列改动i,j之间的字符串从小到大排序,或从大到小排序。维护26的线段树。i,j改动。仅仅须要查询一个a - z的个数,按计数排序的原理,更新一下线段树就能够了。总的复杂度为o(26 * q * log(n));速度有点慢,用伸展树应该快些。由于是成段更新,所以要用延时标记,记-1不更新,0全置0,1全置1,仅仅有这点小技巧就能够了。

#define N 100005
#define M 100005
#define maxn 205
#define SZ 26
#define MOD 1000000000000000007
#define lson (now<<1)
#define rson (now<<1|1)
int n,q,ss,ee,k,num[SZ];
char str[N];
struct node{
int c,sum,l,r;
};
node tree[SZ][N*4];
void pushDown(int tn,int now){
if(tree[tn][now].c != -1){
tree[tn][lson].c = tree[tn][rson].c = tree[tn][now].c;
tree[tn][lson].sum = tree[tn][lson].c*(tree[tn][lson].r-tree[tn][lson].l + 1);
tree[tn][rson].sum = tree[tn][rson].c*(tree[tn][rson].r-tree[tn][rson].l + 1);
tree[tn][now].c = -1;
}
}
void pushUp(int tn,int now){
tree[tn][now].sum = tree[tn][lson].sum + tree[tn][rson].sum ;
}
void buildTree(int l,int r,int now){
FI(SZ)
tree[i][now].c = -1,tree[i][now].l = l,tree[i][now].r = r,tree[i][now].sum = 0;
if(l >= r){
return ;
}
int mid = (l+r)>>1;
buildTree(l,mid,lson);
buildTree(mid+1,r,rson);
}
void updateTree(int l,int r,int now,int s,int e,int tn,int c){
if(s <= l && e>= r){
tree[tn][now].c = c;
tree[tn][now].sum = tree[tn][now].c*(tree[tn][now].r - tree[tn][now].l + 1);
return ;
}
pushDown(tn,now);
int mid = (l+r)>>1;
if(s <= mid) updateTree(l,mid,lson,s,e,tn,c);
if(e > mid) updateTree(mid+1,r,rson,s,e,tn,c);
pushUp(tn,now);
}
int queryTree(int l,int r,int now,int s,int e,int tn){
if(s <= l && e>= r){
return tree[tn][now].sum;
}
pushDown(tn,now);
int mid = (l+r)>>1;
int ans = 0;
if(s <= mid) ans += queryTree(l,mid,lson,s,e,tn);
if(e > mid) ans += queryTree(mid+1,r,rson,s,e,tn);
pushUp(tn,now);
return ans;
}
void outputStr(){
FI(n){
FJ(SZ){
if(queryTree(1,n,1,i+1,i+1,j)){
printf("%c",j+'a');
break;
}
}
}
printf("\n");
}
int main()
{
while(S2(n,q)!=EOF)
{
SS(str);
buildTree(1,n,1);
FI(n){
updateTree(1,n,1,i+1,i+1,str[i] - 'a',1);
}
FI(q){
S2(ss,ee);S(k);
FJ(SZ)
num[j] = queryTree(1,n,1,ss,ee,j);
FJ(SZ)
updateTree(1,n,1,ss,ee,j,0);
if(k){
int sum = 0;
FJ(SZ){
if(num[j])
updateTree(1,n,1,ss + sum,ss + sum + num[j] - 1,j,1);
sum += num[j];
}
}
else {
int sum = 0;
for(int j = SZ - 1;j>=0;j--){
if(num[j])
updateTree(1,n,1,ss + sum,ss + sum + num[j] - 1,j,1);
sum += num[j];
}
}
}
outputStr();
}
return 0;
}

Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记的更多相关文章

  1. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树

    E. A Simple Task 题目连接: http://www.codeforces.com/contest/558/problem/E Description This task is very ...

  2. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树+计数排序

    题目链接: http://codeforces.com/problemset/problem/558/E E. A Simple Task time limit per test5 secondsme ...

  3. Codeforces Round #312 (Div. 2) E. A Simple Task

    题目大意就是给一个字符串,然后多个操作,每次操作可以把每一段区间的字符进行升序或者降序排序,问最终的字符串是多少. 一开始只考虑字符串中字符'a'的情况,假设操作区间[L,R]中有x个'a',那么一次 ...

  4. Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)

    题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...

  5. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

  6. Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树

    题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...

  7. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  8. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

  9. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

随机推荐

  1. 第三讲 $\mathbb{R}^4$上平凡主丛的联络、曲率与Yang-Mills泛函

    一. $\mathbb{R}^4$或$\mathbb{R}^n$上平凡主丛的联络与曲率$\newcommand{\R}{\mathbb{R}}$ 回忆切丛$T\R^n\cong \R^n\times\ ...

  2. java回调方法、钩子方法以及模板方法模式

    在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,其处理事件的方法叫做回调方法.(摘自百度百科) 那么通过上面那句话将百度百科中的&qu ...

  3. 使用commons-email发邮件

    这里我用到了两个包: commons-email-1.3.2.jar mail-1.4.1.jar 如果不加mail.jar,就可能会抛出NoClassDefFoundError异常 之后代码引用ht ...

  4. iOS数字媒体开发浅析

    概述 自然界中的所有看到的听到的都是模拟信号,模拟信号是随时间连续变化,然而手机电脑等信息都属于数字媒体,它们所呈现的内容就是把自然界中这些模拟信号转换成数字信号然后再传递给我们.数字信号不是连续的是 ...

  5. BZOJ 2242 [SDOI2011]计算器 BSGS+高速幂+EXGCD

    题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <c ...

  6. mysql通过DATE_FORMAT将错误数据恢复

    因为如今新开发项目,同事造数据的时候,将时间类型格式造成"20150708".可是实际希望的数据格式是:"2015-07-08" . 数据库使用的是mysql. ...

  7. Install Qt 5 on Ubuntu(使用qt-opensource-linux-x64-5.7.0.run进行安装,而且是官方的wiki)

    Introduction This is a tutorial for installation of Qt 5.7.0 to Ubuntu 12.10. It may be used also fo ...

  8. 洛谷P3807 【模板】卢卡斯定理exgcd

    题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105 ) 求 C_{n+m}^{m}\ mod\ pCn+mm​ mod p 保证P为pri ...

  9. C++中explicit关键字作用

    explicit是c++中不太常用的一个关键字,其作用是用于修饰构造函数,告诉编译器定义对象时不做隐式转换. 举例说明: include <iostream> include <st ...

  10. Web API总结

    1.Web API 控制器(Controller) 继承ApiController 2. Api 的 Url Map: api/{controller}/{id} 每个"Action&quo ...